在 for 循环中嵌套 if

Posted

技术标签:

【中文标题】在 for 循环中嵌套 if【英文标题】:Nesting if in a for loop 【发布时间】:2012-08-15 08:23:39 【问题描述】:

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

for x in $(ls)
do
  if [ -d $x ]
  then
  echo $x
  fi
done

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

【问题讨论】:

正如@geirha 所说,您不应该使用$(ls) 来驱动您的循环。 for x in * 是你想要的。 "ls" 在适当的情况下很好;) "*" 与ls -1 等效(并且“效率更高”,因为它产生的子shell 更少)。 【参考方案1】:

两件事。永远不要使用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

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

不使用for x in $(ls) 迭代文件的原因是因为for 迭代单词ls 输出带有文件名的行。如果这些文件名恰好包含空格,则这些文件名将进一步拆分为单词,因此您将迭代文件名的 words,而不是文件名。显然,对于可行的简单案例,但是当有一种更短且更优雅的方式来处理所有案例时,为什么要使用半有效的解决方案呢?

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

有关更多信息,请参阅http://mywiki.wooledge.org/ParsingLs。

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

【讨论】:

谢谢,你能扩展一下吗?为什么不应该使用 ls? 另外,双方括号和单方括号有区别吗? 这是一个很好的答案,解释得很好。【参考方案2】:

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

如果你尝试过:

for x in $(ls); do if [ -d $x ]; then echo $x; fi; done

这会产生输出吗?

【讨论】:

【参考方案3】:

1) 语法完全合法

2) 是的,您可以在循环内嵌套“if/else”块。您还可以将内循环嵌套在外循环中:)

3) "if [ -d $x ]" 检查"x" 是否是一个"目录"。

如果您没有看到任何输出,那么您可能没有任何子目录?

建议:

打开终端窗口

运行您的脚本。看看你是否得到任何输出。

如果没有,请输入mkdir moose。这将创建一个名为(不巧)“moose”的子目录。

重新运行您的脚本。你应该看到至少“驼鹿”。

【讨论】:

3) 是的,我知道,我试图生成目录的输出。我肯定有目录,它是从 ~ 运行的,仍然没有输出,所以有些不对劲。【参考方案4】:
#!/bin/bash

name=c
for command in "cd $home" " cd XSStrike" "python xsstrike.py"
do
    if [[ $name == "c" ]]; 
    then
        echo "<==========> access granted <==========>"
        $command
    else
        echo "<==========> access denied <==========>"
    fi
done

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。

以上是关于在 for 循环中嵌套 if的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中嵌套 if

JS中for循环嵌套打印100以内3的倍数?

Vue.js v-for中能不能嵌套使用v-if

vue中v-for 和v-if嵌套使用

JAVA里 FOR循环内 IF 与 ELSE的嵌套使用

MATLAB for循环内if语句判断失败