这个问题在这里已经有一个答案:>
How do I echo “-e”?6
给出以下语法:
给出以下语法:
x=(-a 2);echo "${x[@]}";x=(-e 2 -e); echo "${x[@]}"
输出:
-a 2 2 -e
所需输出
-a 2 -e 2 -e
为什么会这样?如何解决?
TL;博士
printf "%s\n" "${x[*]}"
说明
回声需要3个选项:
$help echo […] Options: -n do not append a newline -e enable interpretation of the following backslash escapes -E explicitly suppress interpretation of backslash escapes
所以如果你运行:
$echo -n $echo -n -e $echo -n -e -E
你什么都没有即使你把每个选项放在引号中,它仍然是一样的bash:
$echo "-n" $echo "-n" "-e"
最后一个命令运行echo两个参数:-n和-e.现在对比:
$echo "-n -e" -n -e
我们做的是运行echo一个单一的参数:-n -e.由于bash不能识别(组合)选项-n -e,所以它终于像想要的那样回应到终端的单个参数.
应用于阵列
在第二种情况下,数组x以元素-e开始.在bash扩展数组${x [@]}后,您将有效地运行:
$echo "-e" "2" "-e" 2 -e
由于第一个参数是-e,它被解释为一个选项(而不是回显到终端),如我们已经看到的.
现在与其他风格的数组扩展${x [*]}进行对比,它有效地执行以下操作:
$echo "-e 2 -e" -e 2 -e
bash看到单个参数-e 2 -e,并且由于它不认为作为一个选项 – 它会回显终端的参数.
请注意,${x [*]}样式的扩展一般不安全.举个例子:
$x=(-e) $echo "${x[*]}"
即使我们希望能够被回应,也没有印刷.如果你一直在关注,你已经知道为什么会这样.
逃离
解决方案是将任何参数转义为echo命令.不幸的是,与其他提供某种方式的命令不同,“嘿!以下参数不能被解释为一个选项“(通常是一个参数),bash不会为echo提供这种转义机制.
幸运的是有printf命令,它提供了echo提供的功能的超集.因此,我们得出解决方案:
printf "%s\n" "${x[*]}"