我有这个小脚本:
#!/bin/bash
output=`find "/home/tran/myfolder" -maxdepth 1 -mindepth 1 -type d`
for folder in "$output"
do
echo "This is $folder"
echo "$folder exist"
done
结果是:
This is /home/tran/myfolder/folder1
/home/tran/myfolder/folder2
/home/tran/myfolder/folder3
/home/tran/myfolder/folder1
/home/tran/myfolder/folder2
/home/tran/myfolder/folder3 exist
你能解释一下为什么循环表现如此吗?任何回复都表示赞赏。
答案 0 :(得分:3)
Bash FAQ 001涵盖了逐行迭代命令输出的正确方法。但是,除非您事先了解结果,否则无法保证find
的输出每行产生一个文件,因为换行符是有效的文件名字符。
在您的情况下,您不需要find
;迭代文件名模式将产生您想要的结果:
for folder in /home/tran/myfolder/*/; do
echo "$folder"
done
答案 1 :(得分:2)
从不使用for in
循环遍历文件名。这是因为UNIX上的文件名可能包含空格,如果有,则for in
循环会中断:假设您有一个名为head tail.txt
的文件。在这种情况下,循环将迭代head
和tail.txt
。
您可以直接使用find
来获得所需的结果:
find PATH -maxdepth 1 -mindepth 1 -type d -printf "This is %f\nfolder exists\n"
你也可以使用像chepner explained这样的glob表达式。迭代glob表达式的结果是安全的,因为glob的结果不会受到单词拆分的影响。
答案 2 :(得分:1)
这是因为"
周围有$output
(双引号),它被处理为一个字符串