Bash:以" - "开头的echo字符串

mir*_*e2k 22 bash shell scripting

VAR="-e xyz"
echo $VAR
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这会打印"xyz".我似乎无法找到一种方法来获取字符串以-e开头.

这里发生了什么?

cam*_*amh 45

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

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

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

$
Run Code Online (Sandbox Code Playgroud)

大多数GNU程序都将--参数作为一个参数,意味着不再需要处理选项 - 所有后面的参数--都要作为非选项参数处理.bash echo不支持这个,所以你不能使用它.即使它确实如此,它也不会便携.echo还有其他可移植性问题(-nvs \c,no -e).

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

printf "%s\n" "$VAR"
Run Code Online (Sandbox Code Playgroud)


heb*_*heb 5

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

使用echo"$ VAR"来解决您的问题.

  • 当VAR仅是“ -e”时,双引号不能解决问题 (3认同)