--- title: "10-数组" created: 2025-11-25 tags: - 项目 aliases: - 数组 --- # 数组 数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。 数组下标从0开始。 > [!note] 原理说明 > bash 数组是“稀疏”的——下标不必连续,`array[0]=a` 后直接 `array[5]=b` 也合法,中间的下标视为未定义(读取时得到空串)。这一点与 C/C++、Java 等语言的连续数组不同。另外,函数的返回值不能是数组,需要数组传递时只能借助全局变量或输出字符串再拆分。 ## 定义 数组用小括号表示,元素之间用空格隔开。例如: ```bash array=(1 abc "def" yxc) ``` 也可以直接定义数组中某个元素的值: ```bash array[0]=1 array[1]=abc array[2]="def" array[3]=yxc ``` ## 读取数组中某个元素的值 格式: ```bash ${array[index]} ``` 例如: ```bash array=(1 abc "def" yxc) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[3]} ``` > [!tip] 注意:下标越界与未定义 > 读取不存在的下标(如上例中的 `${array[10]}`)**不会报错**,只会输出空行。判断某个下标是否存在可以用 `test -v`(bash 4.3+):`[ -v 'array[10]' ] && echo 存在 || echo 不存在`。 ## 读取整个数组 格式: ```bash ${array[@]} # 第一种写法 ${array[*]} # 第二种写法 ``` 例如: ```bash array=(1 abc "def" yxc) echo ${array[@]} # 第一种写法 echo ${array[*]} # 第二种写法 ``` ## 数组长度 类似于字符串 ```bash ${#array[@]} # 第一种写法 ${#array[*]} # 第二种写法 ``` 例如: ```bash array=(1 abc "def" yxc) echo ${#array[@]} # 第一种写法 echo ${#array[*]} # 第二种写法 ``` ## 实用操作示例 数组切片——从下标 1 开始取 2 个元素(含头不含尾,下标从 0 数): ```bash array=(1 abc "def" yxc) echo ${array[@]:1:2} # 输出 abc def ``` 数组追加元素: ```bash array=(1 abc "def" yxc) array+=(5 6) # 也可以写作 array[4]=5; array[5]=6 echo ${#array[@]} # 输出6 ``` 遍历数组: ```bash for x in ${array[@]} do echo $x done ``` 删除元素: ```bash array=(1 abc "def" yxc) unset array[1] # 删除下标1的元素,注意下标不会自动前移 echo ${#array[@]} # 输出3 ``` > [!warning] `$@` 与 `$*` 在数组上的区别 > 与默认变量一节提到的规则一致:**不加双引号时 `@` 与 `*` 表现相同**;加双引号后,`"${array[@]}"` 把每个元素作为独立参数传递(元素内含空格也不会被拆开),而 `"${array[*]}"` 把整个数组合并成**一个**字符串。在 `for` 遍历、函数传参中应优先使用 `"${array[@]}"`。 --- **项目分区导航**:[[09-默认变量|默认变量]] ⬅️ | 10-数组 | ➡️ [[11-expr命令|expr命令]]