在 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 语法本身是正确的。不过,我更喜欢将do
和then
放在同一行
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的主要内容,如果未能解决你的问题,请参考以下文章