bash for循环的奇怪行为

时间:2017-05-31 12:10:31

标签: bash shell

我有这个小脚本:

#!/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

你能解释一下为什么循环表现如此吗?任何回复都表示赞赏。

3 个答案:

答案 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的文件。在这种情况下,循环将迭代headtail.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(双引号),它被处理为一个字符串

相关问题