【发布时间】:2011-04-08 19:51:20
【问题描述】:
VAR="-e xyz"
echo $VAR
出于某种原因,这会打印出xyz。我似乎无法找到以-e 开头的字符串。
这是怎么回事?
【问题讨论】:
VAR="-e xyz"
echo $VAR
出于某种原因,这会打印出xyz。我似乎无法找到以-e 开头的字符串。
这是怎么回事?
【问题讨论】:
试试:
echo "$VAR"
改为。
(-e 是 echo 的有效选项 - 这就是导致这种现象的原因)。
【讨论】:
变量VAR 包含-e xyz,如果您通过$ 访问变量,则-e 被解释为echo 的命令行选项。请注意$VAR 的内容不会自动包装到"" 中。
使用echo "$VAR" 解决您的问题。
【讨论】:
将$VAR 放在引号中的答案仅在副作用上是正确的。也就是说,当放在引号中时,echo(1) 接收到单个参数 -e xyz,并且由于这不是一个有效的选项字符串,echo 只是将其打印出来。这是一个副作用,因为echo 可以很容易地打印有关格式错误的选项的错误。大多数程序都会这样做,但似乎 GNU echo(来自 coreutils)和内置于 bash 的版本只是回显以连字符开头但不是有效参数字符串的字符串。此行为未记录在案,因此不应依赖它。
此外,如果 $VAR 包含有效的 echo 选项参数,那么引用 $VAR 将无济于事:
$ VAR="-e"
$ echo "$VAR"
$
大多数 GNU 程序将-- 作为参数表示不再进行选项处理——-- 之后的所有参数都将作为非选项参数处理。 bash echo 不支持这个,所以你不能使用它。即使有,它也不是便携的。 echo 有其他可移植性问题(-n 与 \c,没有 -e)。
正确且可移植的解决方案是使用printf(1)。
printf "%s\n" "$VAR"
【讨论】:
printf 是正确的解决方案,echo 确实应该用于输出一些常量字符串,例如您知道不包含破折号或反斜杠的“Hello world”。
echo,你可以使用转义序列echo -e '\055e'。
在zsh 中,您可以在参数前使用单个破折号 (-)。这确保没有以下参数被解释为选项。
% VAR="-e xyz"
% echo - $VAR
-e xyz
来自zsh 文档:
echo [ -neE ] [ arg ... ]
...
Note that for standards compliance a double dash does not
terminate option processing; instead, it is printed directly.
However, a single dash does terminate option processing, so the
first dash, possibly following options, is not printed, but
everything following it is printed as an argument.
The single dash behaviour is different from other shells.
请记住,此行为特定于 zsh。
【讨论】: