为什么bash吞噬-e在数组的前面

前端之家收集整理的这篇文章主要介绍了为什么bash吞噬-e在数组的前面前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> 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[*]}"

猜你在找的Bash相关文章