当回显时,字符从我的shell变量中消失

时间:2015-10-17 02:00:16

标签: macos bash

这让我非常疯狂:

$ a="/"
echo $a  # note empty output line below

$ var="/home/vivek/foo/bar"
$ echo $var
home vivek foo bar

OS X上bash shell中发生了什么?

我已经在我的另一台Mac上尝试了这个...它完美无缺!

1 个答案:

答案 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} },homevivekfoo,然后传递给bar

echo,当给出多个参数时,用空格打印它们,这就是你所看到的。

(同样,echo作为/的值被解释为只是一个分隔符,其中没有字段,这意味着没有参数传递给$var,它只打印换行符。

这里有2节课:

  • 只有暂时更改echo;完成自定义值后,恢复上一个值。

  • 通常,双引所有变量引用以确保其值保持原样;如果您明确希望 shell扩展应用于其值,则仅使用未加引号的变量引用。