Причина, по которой вы получаете синтаксическую ошибку, заключается в том, что вы не завершаете цикл с помощью оператора "done". Вы должны использовать цикл while вместо цикла for в этом случае, так как цикл for прервется, если любое из имен файлов содержит пробелы или переводы строки.
Кроме того, введенная вами тестовая команда также выдаст синтаксическую ошибку, если глобус развернется до нескольких файлов.
$ [ ! -f ./* ]
bash: [: too many arguments
Вот лучший способ проверить, содержит ли каталог какие-либо файлы:
files=(./*) # populate an array with file or directory names
hasfile=false
for file in "${files[@]}"; do
if [[ -f $file ]]; then
hasfile=true
break
fi
done
if $hasfile; then
while read -r file; do
echo "$file"
done < <(find . -maxdepth 1 -type f)
fi
Кроме того, вы можете просто заменить цикл while на find -print, если у вас есть GNU find:
if $hasfile; then
find . -maxdepth 1 -type f -print
fi