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
还有其他可移植性问题(-n
vs \c
,no -e
).
正确和便携的解决方案是使用printf(1)
.
printf "%s\n" "$VAR"
Run Code Online (Sandbox Code Playgroud)
变量VAR包含-e xyz,如果通过$访问变量,则-e被解释为echo的命令行选项.请注意,$ VAR的内容不会自动包装成"".
使用echo"$ VAR"来解决您的问题.