当数组的第一个元素是'-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
按预期工作,但arrayN
和arrayE
,每个人的行为都不同。
我猜-n
,-e
,可能还有其他人,在某些方面有特殊意义,我感觉不到任何相关信息。
我正在使用GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
答案 0 :(得分:4)
问题在于echo
,而不是数组本身。
如果将数组作为单独的参数打印,-n
和-e
将由echo
解释为选项(不使用换行符打印,并分别使用特殊转义字符打印)。有关更详细的说明,请参阅man echo
。
您可以使用echo '' ${arrayN[@]}
之类的内容来阻止这种情况,但最后会在行的开头添加额外的空格。
如果您不一定要使用echo
,则可以使用cat <<<${arrayN[@]}
或printf "%s\n" "${arrayN[*]}"
答案 1 :(得分:3)
-n
和-e
是echo
的选项。 -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会很好......