为什么这两个表达式在 bash 中不等价?

为什么这两个表达式在 bash 中不等价?

我想知道为什么以下两种情况有两种不同的输出。我预计第二种情况是 2:

localhost:~$ titles=('word1  word2' 'word1  word2')
localhost:~$ echo "${#titles[@]}"
2

localhost:~$ titles=($(echo "'word1  word2' 'word1  word2'"))
localhost:~$ echo "${#titles[@]}"
4

答案1

对数组的第一次赋值titles将两个字符串word1  word2和分配word1  word2给数组。

第二个赋值包含不带引号的命令替换。替换中的命令输出单个字符串'word1  word2' 'word1  word2',并且由于替换未加引号,因此 shell 会将字符上的该字符串拆分$IFS为单词(默认情况下,该变量包含空格、制表符和换行符)。

当字符串被分割成单词时,生成的单词是'word1word2''word1word2'(四个单词)。然后将这些单词作为单独的元素分配给数组titles

这一点在其他问题的回答中得到了进一步的解释。参见示例:

相关内容