Вложение цикла for в оператор if else - PullRequest
0 голосов
/ 26 января 2012
if [ ! -f ./* ]; then
  for files in $(find . -maxdepth 1 -type f); do
    echo $files
else
  echo Nothing here
fi

Возвращает синтаксическую ошибку

возле неожиданного токена `else '

Новое в этом.Может кто-нибудь указать мне, что я сделал не так?

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Причина, по которой вы получаете синтаксическую ошибку, заключается в том, что вы не завершаете цикл с помощью оператора "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
3 голосов
/ 26 января 2012

Вы забыли done!

if [ ! -f ./* ]; then
  for files in $(find . -maxdepth 1 -type f); do
    echo $files
  done
else
  echo Nothing here
fi
0 голосов
/ 26 января 2012

Синтаксис "for":

для: для ИМЯ [в СЛОВАХ;;] делать КОМАНДЫ; сделано

Вам не хватает "готово"

Попробуйте

if [ ! -f ./* ]; then
  for files in $(find . -maxdepth 1 -type f); do
    echo $files
  done
else
  echo Nothing here
fi

Кстати, вы имели в виду эхо в нижнем регистре, а не в ECHO?

...