考虑:
# 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
我理解第一个例子。
我知道在第二个示例中,双引号会以某种方式强制将空字符串视为arg,因为单词拆分是如何工作的-但我对细节感到迷惑。
我认为第三个示例的工作方式与第一个示例相似:在单词拆分过程中,它只是作为空白处理。
我不清楚为什么在第四种情况下要特别对待数组。
我想解释一下幕后发生的事情,以便更好地理解它,以及man bash的任何相关引文(我找不到能解释这种行为的任何东西,但很可能错过了)。
答案 0 :(得分:3)
man bash
:
可以使用
${name[subscript]}
引用数组的任何元素。需要使用花括号来避免与路径名扩展冲突。 如果下标是@
或*
,则单词会扩展到name的所有成员。仅当单词出现在双引号中时,这些下标才不同。如果单词用双引号引起来,${name[*]}
会扩展为单个单词,每个数组成员的值都由IFS特殊字符的第一个字符分隔变量,然后${name[@]}
将name的每个元素扩展为一个单独的单词。 没有数组成员时,${name[@]}
会扩展为空。