数组声明:双引号和括号

ebs*_*bsf 1 bash quoting variable bash-array

也许这是一个愚蠢的问题,但在谷歌上搜索了两个小时并没有找到任何有意义的东西。

简单地说,Bash 中是否存在以下区别:

X="
a
b
c
"
Run Code Online (Sandbox Code Playgroud)

X=(
a
b
c
)
Run Code Online (Sandbox Code Playgroud)

前者符合变量的定义,后者符合数组的定义。

数组是一个多元素变量,那么这是否意味着前者也是一个用于所有目的的数组?

如果前者是一个数组,那么(a)双引号和(b)括号之间唯一的操作区别是对数组元素的引用规则的操作吗?

非常感谢您的任何见解。

cho*_*oba 5

不,前者不是数组。

例如,您不能使用索引来选择成员:

arr=(a b c)
echo "${arr[1]}"  # b
Run Code Online (Sandbox Code Playgroud)

您可以使用数组来传递参数,但不能使用字符串。使用包含空格的元素可以获得更好的效果:

arr=(a 'b c' d)
printf '(%s)\n' "${arr[@]}"

string=$'\nm\nn o\np\n'
printf '(%s)\n' $string
Run Code Online (Sandbox Code Playgroud)

输出:

(a)
(b c)
(d)
(m)
(n)
(o)
(p)
Run Code Online (Sandbox Code Playgroud)

man bash包含两种变量类型的描述,无需谷歌搜索。

  • 为了获得更清晰的效果,您可以在数组元素中包含换行符:`arr=(a 'b c' $'d\ne\nf' g)` (2认同)