1

我正在为 Bash 变量扩展而苦苦挣扎。请看以下代码:

~/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
4

1 回答 1

8

要做你想做的事,你必须使用以下内容:

a=(~/Library/Application\ *)  # use an *array* to capture the pathname-expanded results
echo "${a[@]}"                # output all array elements (without further expansion)

至于为什么您的代码不起作用:

在仅涉及文字字符串插值(对其他变量的引用)的变量赋值的上下文中,不会发生路径名扩展,即使使用未引用的字符串(例如,a=*,a="*"a='*'所有赋值文字 *[1]

(相比之下,路径名扩展应用于数组定义内的未加引号的字符串(例如或在命令替换内(例如,)。)a=(*)a=$(echo *)

因此, 的字面内容$a/Users/foo/Library/Application *

执行echo $a- 即,不双引号变量引用$a- 然后应用分词并执行以下操作:

  • 它打印文字'/Users/foo/Library/Application'(第一个单词 - 由于其内容,没有应用扩展)
  • 它打印应用到的路径名扩展*(第二个单词 - 即,它扩展为当前目录中的匹配文件名。)

后者*在您的情况下导致的事实意味着您碰巧从一个echo目录运行命令(保存隐藏文件,假设默认配置)。


[1]然而,字符串是否不加引号对波浪号扩展很重要;例如,a=~扩展~到用户的主目录,而a='~'ora="~"分配文字 ~.

于 2014-12-19T02:42:04.287 回答