在if else语句中嵌套for循环

时间:2012-01-26 19:12:15

标签: bash shell if-statement for-loop

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

返回

  

意外标记'else'附近的语法错误

新的。谁能指出我做错了什么?

3 个答案:

答案 0 :(得分:3)

你忘记了done

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

答案 1 :(得分:3)

您收到语法错误的原因是因为您没有使用“done”语句结束循环。在这种情况下,您应该使用while循环而不是for循环,因为如果任何文件名包含空格或换行符,for循环将会中断。

此外,如果glob扩展为多个文件,您发出的测试命令也会出现语法错误。

$ [ ! -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

另外,如果你有GNU find:

,你可以简单地用find -print替换while循环
if $hasfile; then
   find . -maxdepth 1 -type f -print
fi

答案 2 :(得分:0)

“for”的语法是

for:for NAME [in WORDS ...;] do COMMANDS;完成

你错过了“完成”

尝试

if [ ! -f ./* ]; then
  for files in $(find . -maxdepth 1 -type f); do
    echo $files
  done
else
  echo Nothing here
fi
顺便说一句,你的意思是用小写而不是ECHO回声吗?