为什么变量替换如此不同?

问题描述 投票:0回答:1

当前目录中有两个文件

[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 周围的双引号

为什么输出如此,任何人都可以解释一下吗?

提前感谢任何帮助。

bash shell
1个回答
0
投票

echo "$f"
中,
$f
被扩展(参数扩展)并替换为变量
f
的值。由于双引号,结果被视为一个单词并打印而无需进一步扩展。在
echo $f
中,
$f
也被扩展并替换为
f
的值,但扩展继续进行路径名扩展(参数扩展和路径名扩展之间还有其他几种扩展,但它们在这里不起作用)。

在您的情况下,find 命令被替换为

"./? ./?"
。所以循环只用
f="./? ./?"
迭代一次。执行时
echo $f
参数扩展给出
echo ./? ./*
,然后路径名扩展将
./?
替换为当前目录中具有单字符名称的所有文件(在您的情况下为
./?
./*
),并且
./*
替换为当前目录中的所有文件(在您的情况
./?
./*
)。这就是为什么你会看到他们两次。

© www.soinside.com 2019 - 2024. All rights reserved.