为什么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 "%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[*]}" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |