В дополнение к тому, что @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
(, который я изначально пропустил ).
ОП сказал, что:
# id tester
uid=0(root) gid=0(root) groups=0(root)
Это означает, что пользователь tester
является root
с точки зрения разрешений/безопасности и chown
не должен делать ничего, что указано в выводе chown.
Пожалуйста, удалите пользователяtester
(userdel tester
)и заново создайте его в обычном режиме, т.е.
(sudo) useradd tester