也许这是一个愚蠢的问题,但在谷歌上搜索了两个小时并没有找到任何有意义的东西。
简单地说,Bash 中存在以下区别:
X="
a
b
c
"
和
X=(
a
b
c
)
前者符合变量的定义,后者符合数组的定义。
数组是一个多元素变量,那么这是否意味着前者也是一个用于所有目的的数组?
如果前者是一个数组,那么(a)双引号和(b)括号之间唯一的操作区别是对数组元素的引用规则的操作吗?
非常感谢您的任何见解。
答案1
不,前者不是数组。
例如,您不能使用索引来选择成员:
arr=(a b c)
echo "${arr[1]}" # b
您可以使用数组来传递参数,但不能使用字符串。使用包含空格的元素可以获得更好的效果:
arr=(a 'b c' d)
printf '(%s)\n' "${arr[@]}"
string=$'\nm\nn o\np\n'
printf '(%s)\n' $string
输出:
(a)
(b c)
(d)
(m)
(n)
(o)
(p)
man bash
包含两种变量类型的描述,无需谷歌搜索。
答案2
以换行符分隔的子字符串组成的字符串与字符串数组不同。一个是字符串;另一个包含字符串。
通过在字符串中包含换行符将字符串分为行这一事实对于字符串的存储没有特别的意义。 shell 无法在行上对其进行索引,并且单行不能包含嵌入的换行符而不以某种方式对其进行编码。
该数组是一组有序的单独字符串。每个字符串都可以通过数组的索引立即访问。单个数组元素可以包含任何标准字符串,带或不带换行符或其他分隔字符(shell 中的 nul 字符除外bash
)。但是,数组元素不能是另一个数组,因为bash
不支持多维数组。
string1='Hello World'
string2="'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe:
All mimsy were the borogoves,
And the mome raths outgrabe."
array=( "$string1" "$string2" )
printf '%s\n' "${array[1]}"
上面的脚本片段打印了刘易斯·卡罗尔 (Lewis Carroll) 的诗《Jabberwocky》中的第一节经文。它不会打印,Hello World
因为我们选择输出数组的第二个元素,而不是第一个元素。第二个元素是由字符组成的单个字符串。其中一些字符恰好是换行符和空格,但这只是为了演示目的。
要从第二个数组元素中的诗歌中仅输出一行或任何其他子字符串,我们需要使用一些实用程序来解析字符串。从字符串中提取单个换行符分隔的子字符串与 shell 中数组的概念没有任何关系。