数组
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从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[@]}"。
💬 评论