Bash:如果在for循环中嵌套

Jam*_*son 21 bash for-loop if-statement

我是bash脚本的新手,所以这可能是一个愚蠢的语法错误,但为什么这段代码不起作用?

for x in $(ls)
do
  if [ -d $x ]
  then
  echo $x
  fi
done
Run Code Online (Sandbox Code Playgroud)

单独的for和if部分可以自行工作,但这不会产生任何输出.

谢谢.

gei*_*rha 24

两件事情.永远不要使用ls迭代文件,并引用参数扩展"$x".for和if语法本身是正确的.我更愿意把dothen在同一行,虽然

for file in *; do
    if [[ -d "$file" ]]; then
        echo "$file is a directory"
    elif [[ -f "$file" ]]; then
        echo "$file is a regular file"
    fi
done
Run Code Online (Sandbox Code Playgroud)

对于学习bash,我建议阅读http://mywiki.wooledge.org/BashGuide大多数其他教程和指南遗憾的是不是很好.

不进行for x in $(ls)迭代文件的原因是因为for迭代单词ls输出带有文件名的行.如果这些文件名碰巧包含空格,那么这些文件名将被进一步拆分为单词,因此您将迭代文件名的单词,而不是文件名.显然,对于有效的简单案例,但为什么在处理所有案例时采用更短更优雅的方式时使用半工作解决方案?

使用for x in *shell替换*当前目录中匹配该模式的所有文件名(称为路径名扩展),并且每个文件名将是一个单独的单词,因此无论文件名包含哪些字符,它都将起作用.文件名可以包含任何字符(包括换行符),/NUL字节除外(\ 0).

有关详细信息,请参阅http://mywiki.wooledge.org/ParsingLs.

至于使用[[VS [.[是从bourne shell继承的命令,用于测试字符串,文件和数字.Bash添加了一个更强大的[[关键字,可以做任何事情[,甚至更多.如果你正在写一个sh脚本,你必须使用[,但在的bash脚本,你应该使用更强大[[((语法.有关和之间区别的更多信息,请参见http://mywiki.wooledge.org/BashFAQ/031.[[[


imm*_*imm 5

也许用于分隔语句的不同部分的字符存在问题?

如果您尝试了怎么办

for x in $(ls); do if [ -d $x ]; then echo $x; fi; done
Run Code Online (Sandbox Code Playgroud)

这会产生输出吗?