`chown -Тестер Rv. `не изменит владельца файлов

В дополнение к тому, что @igal сказал о проверке расширения файла, у вас много ошибок в синтаксисе и использовании переменных. Начните со строки 3:

L0_Report_Generator=("/home/ubuntu/$gzip_file")

Переменная gzip_fileеще не установлена, поэтому $gzip_fileне будет заменено ничем, когда оболочка расширит ее. Кроме того, скобки в var=(something)присваивают массив вместо простой переменной, и в данном случае это не имеет никакого смысла.

Четвертая строка, echo -n "Enter File Directory:"$gzip_file, имеет ту же проблему с переменной gzip_file. У него также есть проблема, заключающаяся в том, что echo -nнепредсказуема и будет выполнять разные действия в разных версиях команды echo. Чтобы напечатать строку без перевода строки, лучше использовать printf "%s" "string to print", но в этом случае есть лучший вариант, к которому я вернусь через минуту.

Пятая строка, read $gzip_file, похоже, предназначена для чтения пользовательского ввода в переменную gzip_file, но это не то, что она делает. В оболочке, когда вы ставите $перед именем переменной, получает текущее значение переменной. Здесь вы хотите установить , поэтому вы должны оставить $выключенным:read gzip_file. Но это не то, что я бы сделал. Я бы включил приглашение (, которое вы echoв строке 4 ), как часть команды read:

.

read -p "Enter File Directory:" gzip_file

Хорошо, теперь строка 6:

for gzip_file in {$L0_Report_Generator}; do

Похоже, это установкаgzip_fileснова (, заменяющая значение, которое мы только что readв него ). Вы на самом деле пытаетесь установить здесь gzip_file, и предыдущие ссылки на переменные действительно должны были быть другой переменной (, может быть, gzip_dirвместо )?

Кроме того, часть inне имеет никакого смысла. Я думаю, вы пытаетесь использовать переменную L0_Report_Generator, но в этом случае открывающая скобка должна идти после знака доллара. Но это тоже не совсем понятно, потому что ${L0_Report_Generator}будет (, если я понимаю, что это должно делать, )будет просто путем к каталогу. for... inне перебирает содержимое каталогов,он перебирает список из слов , например for var in word1 word2 "word 3 which has several spaces in it" word4; do. Если вы хотите получить список файлов в каталоге, вам нужно использовать подстановочный знак, например for var in dir/*; do--, оболочка расширит подстановочный знак -, содержащий шаблон файла, в список соответствующих файлов, каждый из которых рассматривается как слово перебрать их. У вас также есть возможность ограничить совпадения файлами с определенным расширением, включив его в шаблон, например dir/*.gz.

Три других примечания :Я рекомендую не использовать имена переменных в верхнем регистре, такие как DATE, чтобы избежать конфликтов с различными переменными окружения, заглавными -, которые имеют особое значение для оболочки или некоторых утилит. Кроме того, всегда двойные -заключайте в кавычки ваши ссылки на переменные (, т. е. используйте "$var"вместо $var), чтобы избежать неожиданных странностей синтаксического анализа. И предложение elseне имеет проверки, поэтому использование else [[ some test ]]не имеет смысла (, а наличие thenпосле elseявляется синтаксической ошибкой ).

Итак, если бы я понял, что должен делать скрипт, я бы рекомендовал заменить начало скрипта на:

#!/bin/bash
date=$(date +%Y-%m-%d)    # Note lowercase variable
read -p "Enter File Directory:" gzip_dir
L0_Report_Generator="/home/ubuntu/$gzip_dir"

for gzip_file in "${L0_Report_Generator}"/*.gz; do

...И затем (, если приведенный выше шаблон.gz - это то, что вам нужно ), вам не нужен if, чтобы проверить, имеет ли $gzip_fileрасширение.gz, потому что шаблон подстановочных знаков будут перечислены только файлы.gz.

Еще одно примечание:shellcheck.net очень полезно для выявления основных ошибок в сценариях оболочки. Он упускает многое из того, что я указал, но уловил случайный then(, который я изначально пропустил ).

0
10.09.2020, 12:40
1 ответ

ОП сказал, что:

# id tester
uid=0(root) gid=0(root) groups=0(root)

Это означает, что пользователь testerявляется rootс точки зрения разрешений/безопасности и chownне должен делать ничего, что указано в выводе chown.

Пожалуйста, удалите пользователяtester(userdel tester)и заново создайте его в обычном режиме, т.е.

(sudo) useradd tester
1
18.03.2021, 23:06

Теги

Похожие вопросы