为什么带引号的空数组不是参数,而是带引号的空字符串?

时间:2019-06-08 03:49:14

标签: bash

考虑:

# double quotes make empty variables count as args

emptyvar=""
printf %s%s%sEND $emptyvar a b c
echo ""
printf %s%s%sEND "$emptyvar" a b c

echo ""
echo ""

# but an empty array does not count, even with double quotes

empty=()
printf %s%s%sEND ${empty[@]} a c b
echo ""
printf %s%s%sEND "${empty[@]}" a b c

输出:

abcEND
abENDcEND

acbEND
abcEND

Try it online!

我理解第一个例子。

我知道在第二个示例中,双引号会以某种方式强制将空字符串视为arg,因为单词拆分是如何工作的-但我对细节感到迷惑。

认为第三个​​示例的工作方式与第一个示例相似:在单词拆分过程中,它只是作为空白处理。

我不清楚为什么在第四种情况下要特别对待数组。

我想解释一下幕后发生的事情,以便更好地理解它,以及man bash的任何相关引文(我找不到能解释这种行为的任何东西,但很可能错过了)。

1 个答案:

答案 0 :(得分:3)

man bash

  

可以使用${name[subscript]}引用数组的任何元素。需要使用花括号来避免与路径名扩展冲突。 如果下标是@*,则单词会扩展到name的所有成员。仅当单词出现在双引号中时,这些下标才不同。如果单词用双引号引起来,${name[*]}会扩展为单个单词,每个数组成员的值都由IFS特殊字符的第一个字符分隔变量,然后${name[@]}将name的每个元素扩展为一个单独的单词。 没有数组成员时,${name[@]}会扩展为空。