数组

数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。

数组下标从0开始。

ℹ️原理说明

bash 数组是“稀疏”的——下标不必连续,array[0]=a 后直接 array[5]=b 也合法,中间的下标视为未定义(读取时得到空串)。这一点与 C/C++、Java 等语言的连续数组不同。另外,函数的返回值不能是数组,需要数组传递时只能借助全局变量或输出字符串再拆分。

定义

数组用小括号表示,元素之间用空格隔开。例如:

array=(1 abc "def" yxc)

也可以直接定义数组中某个元素的值:

array[0]=1
array[1]=abc
array[2]="def"
array[3]=yxc

读取数组中某个元素的值

格式:

${array[index]}

例如:

array=(1 abc "def" yxc)
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
💡注意:下标越界与未定义

读取不存在的下标(如上例中的 ${array[10]}不会报错,只会输出空行。判断某个下标是否存在可以用 test -v(bash 4.3+):[ -v 'array[10]' ] && echo 存在 || echo 不存在

读取整个数组

格式:

${array[@]}  # 第一种写法
${array[*]}  # 第二种写法

例如:

array=(1 abc "def" yxc)

echo ${array[@]}  # 第一种写法
echo ${array[*]}  # 第二种写法

数组长度

类似于字符串

${#array[@]}  # 第一种写法
${#array[*]}  # 第二种写法

例如:

array=(1 abc "def" yxc)

echo ${#array[@]}  # 第一种写法
echo ${#array[*]}  # 第二种写法

实用操作示例

数组切片——从下标 1 开始取 2 个元素(含头不含尾,下标从 0 数):

array=(1 abc "def" yxc)
echo ${array[@]:1:2}  # 输出 abc def

数组追加元素:

array=(1 abc "def" yxc)
array+=(5 6)  # 也可以写作 array[4]=5; array[5]=6
echo ${#array[@]}  # 输出6

遍历数组:

for x in ${array[@]}
do
    echo $x
done

删除元素:

array=(1 abc "def" yxc)
unset array[1]  # 删除下标1的元素,注意下标不会自动前移
echo ${#array[@]}  # 输出3
⚠️`$@` 与 `$*` 在数组上的区别

与默认变量一节提到的规则一致:不加双引号时 @* 表现相同;加双引号后,"${array[@]}" 把每个元素作为独立参数传递(元素内含空格也不会被拆开),而 "${array[*]}" 把整个数组合并成一个字符串。在 for 遍历、函数传参中应优先使用 "${array[@]}"


项目分区导航默认变量 ⬅️ | 10-数组 | ➡️ expr命令