我正在努力克服变量扩展。请参阅以下代码:
~/tmp 689$ a=~/Library/Application\ *; echo $a
/Users/foo/Library/Application *
~/tmp 690$ echo ~/Library/Application\ *
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support
由于扩展顺序为括号 - >代字号 - >参数 - > ...> - >路径名,
为什么路径名扩展未应用于$a
的方式与第二个命令中的方式相同?
[加入]
空格转义是否隐藏了以下输出的行为?
~/tmp 705$ a=~/Library/Application*; echo $a
/Users/foo/Library/Application Scripts /Users/foo/Library/Application Support
答案 0 :(得分:8)
要做你想做的事,你必须使用以下内容:
a=(~/Library/Application\ *) # use an *array* to capture the pathname-expanded results
echo "${a[@]}" # output all array elements (without further expansion)
至于为什么你的代码不起作用:
在变量赋值的上下文中仅涉及文字或字符串插值(对其他变量的引用), NO路径名扩展即使使用未加引号字符串(例如a=*
,a="*"
和a='*'
也会分配文字 *
) [1] 。
(相比之下,路径名扩展 应用于数组定义中的未加引号的字符串(例如a=(*)
,或命令替换< / em>(例如,a=$(echo *)
)。)
因此,$a
的文字内容为/Users/foo/Library/Application *
执行echo $a
- 即,不要双引号变量引用$a
- 然后应用分词并执行以下操作:
'/Users/foo/Library/Application'
(第一个字 - 由于其内容而未应用扩展)*
的路径名扩展(第二个单词 - 即,它扩展为当前目录中的匹配文件名。)后者在您的情况下导致*
这一事实意味着您恰好在空目录中运行echo
命令(除了隐藏文件,假设默认配置)。
[1] 但是,字符串是否未加引号确实与代表扩展有关;例如,a=~
将~
扩展到用户的主目录,而a='~'
或a="~"
分配文字 ~
。