Bash:以“ - ”开头的echo字符串

时间:2010-09-06 15:15:23

标签: bash scripting shell

VAR="-e xyz"
echo $VAR

出于某种原因打印“xyz”。我似乎无法找到一种方法来获取字符串以-e开头。

这里发生了什么?

5 个答案:

答案 0 :(得分:43)

$VAR放在引号中的答案只能通过副作用来纠正。也就是说,当放入引号时,echo(1)会收到-e xyz的单个参数,由于这不是有效的选项字符串,echo只会将其打印出来。这是副作用,因为echo可以轻松打印有关格式错误选项的错误。大多数程序都会这样做,但似乎GNU echo(来自coreutils)和内置于bash的版本只是回显以连字符开头但不是有效参数字符串的字符串。此行为未记录,因此不应依赖它。

此外,如果$VAR包含有效的echo选项参数,则引用$ VAR将无济于事:

$ VAR="-e"
$ echo "$VAR"

$

大多数GNU程序将--作为参数表示不再需要处理选项 - --之后的所有参数都将作为非选项参数处理。 bash echo不支持此功能,因此您无法使用它。即使它确实如此,它也不会便携。 echo存在其他可移植性问题(-n vs \c,无-e)。

正确且便携的解决方案是使用printf(1)

printf "%s\n" "$VAR"

答案 1 :(得分:5)

变量VAR包含 -e xyz ,如果通过$访问变量, -e 将被解释为echo的命令行选项。请注意,$ VAR的内容不会自动包装成“”。

使用echo“$ VAR”来解决您的问题。

答案 2 :(得分:2)

尝试:

echo "$VAR"

代替。

-eecho的有效选项 - 这就是造成这种现象的原因。)

答案 3 :(得分:0)

bash将-e解释为echo的参数。尝试

echo "$VAR"

答案 4 :(得分:0)

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