加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:29:50 所属栏目:安全 来源:网络整理
导读:这个问题在这里已经有一个答案: How do I echo “-e”?6 给出以下语法: x=(-a 2);echo "${x[@]}";x=(-e 2 -e); echo "${x[@]}" 输出: -a 22 -e 所需输出 -a 2-e 2 -e 为什么会这样?如何解决? TL;博士 printf "%sn" "${x[*]}" 说明 回声需要3个选项: $
这个问题在这里已经有一个答案:> 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 "%sn" "${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 "%sn" "${x[*]}"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读