我的问题是关于外壳和水珠的问题。
在执行类似操作时:
myglob=*
echo $myglob
我得到了目录的文件列表,所以没关系
但是当我做一个:
myglob=*
echo "$myglob"
*
我得到的是*而不是目录中的文件。 我不明白,shell不会将*传递给echo命令吗?
答案 0 :(得分:1)
来自the bash manual page on double quotes:
用双引号('“')引起来的字符将保留引号中所有字符的文字值,但'$','`','\'除外,并且在启用历史记录扩展功能时,'! '。
第二条命令的计算结果为:
echo "*"
根据链接,该链接不会展开。
答案 1 :(得分:1)
shell是否将*传递给echo命令?
是的,就是这个问题。
echo
只会写出您通过的内容。如果您将其传递给*
,它将始终只写出*
。
完成时
myglob=*
echo $myglob
Bash 不通过*
。
相反,bash首先扩展了glob,实际上将命令重写为echo file1 file2 file3 file4...
。毫不奇怪,echo
然后写file1 file2 file3 file4...
。
答案 2 :(得分:1)
shell是否将*传递给echo命令?
是的,当它用引号引起来时。文件名扩展 globbing 是由外壳程序在行扫描期间完成的(不是echo
命令),但是当模式在引号内时则不会。
set -x
(xtrace
)是您的朋友,它显示了扩展及其发生的时间(前导+
是xtrace
提示符,PS4
) :
set -x
myglob=*
echo $myglob
礼物:
+ myglob='*'
+ echo ... filenames in the current directory ...
您可以看到在调用{em> *
之前已完成echo
的扩展。
位置:
set -x
myglob=*
echo "$myglob"
礼物:
+ myglob='*'
+ echo '*'
*
在这里您可以看到没有扩展,这是使用引号的一个原因(还有其他原因)。
set +x
将关闭xtrace
功能。