gpt4 book ai didi

bash - 在 for 循环中嵌套 if

转载 作者:行者123 更新时间:2023-11-29 08:44:42 26 4
gpt4 key购买 nike

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

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

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

最佳答案

两件事。切勿使用 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 迭代了 wordsls 输出带有文件名的行。如果这些文件名恰好包含空格,这些文件名将进一步拆分为单词,因此您将迭代文件名的单词,而不是文件名。显然,对于有效的简单案例,但为什么在有处理所有案例的更短、更优雅的方法时使用半工作解决方案?

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

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

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

关于bash - 在 for 循环中嵌套 if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com