这让我非常疯狂:
$ a="/"
echo $a # note empty output line below
$ var="/home/vivek/foo/bar"
$ echo $var
home vivek foo bar
OS X上bash
shell中发生了什么?
我已经在我的另一台Mac上尝试了这个...它完美无缺!
答案 0 :(得分:3)
<强> TL; DR:强>
将特殊$IFS
变量重置为默认值IFS=$' \t\n'
- 或者,最好双引号您的变量引用(echo "$var"
)以打印值原样
您引用了$var
未加引号,这意味着其值受分词(many expansions that Bash applies to unquoted tokens之一)的影响。< / p>
单词拆分由内置$IFS
变量(内部字段分隔符)中定义的任何字符进行,默认为$' \t\n'
(空格,制表符,换行符)。
在您的情况下,$IFS
包含/
(可能包含其他字符。),这意味着/home/vivek/foo/bar
被拆分为单独的参数 {{1} },home
,vivek
,foo
,然后传递给bar
。
echo
,当给出多个参数时,用空格打印它们,这就是你所看到的。
(同样,echo
作为/
的值被解释为只是一个分隔符,其中没有字段,这意味着没有参数传递给$var
,它只打印换行符。
这里有2节课:
只有暂时更改echo
;完成自定义值后,恢复上一个值。
通常,双引所有变量引用以确保其值保持原样;如果您明确希望 shell扩展应用于其值,则仅使用未加引号的变量引用。