bash:缺少数组的第一个元素

时间:2014-02-20 17:22:46

标签: arrays bash echo

当数组的第一个元素是'-n'或'-e'时,有奇怪的行为,看起来有些时候缺少第一个元素。

我的脚本test.sh

#!/bin/bash
declare -a arrayP=('-p' 'text')
echo "arrayP"
echo ${arrayP[@]}
echo "${arrayP[@]}"
echo "'${arrayP[@]}'"
echo " ${arrayP[@]}"

echo ""

declare -a arrayN=('-n' 'text')
echo "arrayN"
echo ${arrayN[@]}
echo "${arrayN[@]}"
echo "'${arrayN[@]}'"
echo " ${arrayN[@]}"

echo ""

declare -a arrayE=('-e' 'text')
echo "arrayE"
echo ${arrayE[@]}
echo "${arrayE[@]}"
echo "'${arrayE[@]}'"
echo " ${arrayE[@]}"

执行结果:

root@host:~# ./test.sh
arrayP:
-p text
-p text
'-p text'
 -p text

arrayN:
texttext'-n text'
 -n text

arrayE:
text
text
'-e text'
 -e text
root@host:~#

arrayP按预期工作,但arrayNarrayE,每个人的行为都不同。

我猜-n-e,可能还有其他人,在某些方面有特殊意义,我感觉不到任何相关信息。

我正在使用GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)

3 个答案:

答案 0 :(得分:4)

问题在于echo,而不是数组本身。 如果将数组作为单独的参数打印,-n-e将由echo解释为选项(不使用换行符打印,并分别使用特殊转义字符打印)。有关更详细的说明,请参阅man echo

您可以使用echo '' ${arrayN[@]}之类的内容来阻止这种情况,但最后会在行的开头添加额外的空格。

如果您不一定要使用echo,则可以使用cat <<<${arrayN[@]}printf "%s\n" "${arrayN[*]}"

正确打印

答案 1 :(得分:3)

-n-eecho的选项。 -n使其不打印换行符,-e使其解释转义序列。在某些情况下,当您展开数组时,bash会将这些选项作为echo的选项进行读取。例如:

$ echo -n hello          # no newline
hello$ echo "-n hello"   # string "-n hello"
-n hello
$ echo -e "\n"           # extra newline


$ echo "-e \n"           # string "-e \n"
-e \n

-E也会有类似的行为。

根据阿托斯爵士的回答,另一种选择是使用printf %s

答案 2 :(得分:2)

另外,请注意这个有趣的行为:

$ array=('-n' 'text')

$ echo "${array[@]}"      # array expands into individual elements
text                      # no newline

$ echo "${array[*]}"      # array printed as a single string.
-n text

在bash提示符下,键入help echo。如果有一个--选项,那么echo会很好......