当前目录中有两个文件
[root@workspace tmp]# ll
total 8
-rw-------. 1 root root 6 Mar 31 13:18 *
-rw-------. 1 root root 6 Mar 31 13:18 ?
[root@workspace tmp]# for f in "`find . -type f`";do echo "$f";done
./*
./?
[root@workspace tmp]# for f in "`find . -type f`";do echo $f;done
./* ./? ./* ./?
我对两个 echo 的输出感到困惑......
不同之处在于:$f 周围的双引号
为什么输出如此,任何人都可以解释一下吗?
提前感谢任何帮助。
在
echo "$f"
中,$f
被扩展(参数扩展)并替换为变量 f
的值。由于双引号,结果被视为一个单词并打印而无需进一步扩展。在 echo $f
中,$f
也被扩展并替换为 f
的值,但扩展继续进行路径名扩展(参数扩展和路径名扩展之间还有其他几种扩展,但它们在这里不起作用)。
在您的情况下,find 命令被替换为
"./? ./?"
。所以循环只用 f="./? ./?"
迭代一次。执行时echo $f
参数扩展给出 echo ./? ./*
,然后路径名扩展将 ./?
替换为当前目录中具有单字符名称的所有文件(在您的情况下为 ./?
和 ./*
),并且 ./*
替换为当前目录中的所有文件(在您的情况./?
和./*
)。这就是为什么你会看到他们两次。