我们一起来学Shell - shell的数组

本文详细介绍了Shell脚本中的数组概念及其应用。包括数组的基本定义、不同方式的定义与初始化、数组元素的引用与遍历等核心内容,并探讨了关联数组的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们一起来学Shell - 初识shell
我们一起来学Shell - shell的变量
我们一起来学Shell - shell的条件判断
我们一起来学Shell - shell的循环控制
我们一起来学Shell - shell的数组
我们一起来学Shell - shell的函数
我们一起来学Shell - shell的并发及并发控制
我们一起来学Shell - 正则表达式

什么是数组

Shell 的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。

有了Shell数组后,就可以用相同名字引用一系列变量及变量值,并通过数字(索引)来识别使用它们。

在许多场合,使用数组可以缩短和简化程序开发。

数组的本质还是变量,是特殊的变量形式

数组中常用变量

${ARRAY_NAME[INDEX]}      # 引用数组中的元素 注意:引用时,只给数组名,表示引用下标为0的元素
${#ARRAY_NAME[*]}         # 数组中元素的个数
${#ARRAY_NAME[@]}         # 数组中元素的个数

${ARRAY_NAME[*]}          # 引用数组中的所有元素
${ARRAY_NAME[@]}          # 引用数组中的所有元素
${#ARRAY_NAME}            # 数组中下标为 0 的字符个数

数组的定义

通过数组名[下标]对数组进行定义和赋值,如果下标不存在,自动添加新一个数组元素,如果下标存在就覆盖原来的值

删除数组和删除变量是一样的,使用unset即可

小括号定义数组变量

  • 用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔
arry=(hello world)

输出数组的变量值

echo ${arry[@]}
echo ${arry[0]}
echo ${arry[1]}

索引数组下标从数字0开始,0表示第一个变量值

小括号加键值对定义数组变量

arry=([3]=hello [4]=world)

输出数组的变量值

echo ${arry[@]}
echo ${arry[3]}
echo ${arry[4]}

指定数组下标,输出指定的变量值

分别定义数组变量

arry[0]=hello
arry[1]=world
arrys[0]=study
arrys[1]=shell

输出数组的变量值

echo ${arry[@]}
echo ${arrys[@]}

动态地定义数组变量

  • 使用命令的输出结果作为数组的内容
arry=($(ls /etc/ | head -n 5 ))

输出数组的变量值

echo ${arry[@]}

数组赋值的切片

#!/usr/bin/env bash
array=({a..z})

echo "数组的变量值为:${array[@]}"
echo "数组的变量值个数为:${#array[@]}"
echo "从第一个字符开始往后的五个字符的内容: ${array[@]:0:5}"
echo "从第六个字符开始往后的五个字符的内容: ${array[@]:5:5}"

结果如下

数组的变量值为:a b c d e f g h i j k l m n o p q r s t u v w x y z
数组的变量值个数为:26
从第一个字符开始往后的五个字符的内容: a b c d e
从第六个字符开始往后的五个字符的内容: f g h i j

数组的赋值删除、替换,与变量的赋值删除、替换的方式也是一样的,只是数组的变量值的书写方式不同,区别在于[@],这是数组输出所有变量值的方式

关于变量的赋值删除、替换,可以看我的另一篇博客()[01-我们一起来学Shell - shell的变量]

遍历数组

#!/usr/bin/env bash
array=(hello world welcome to study shell)

for (( i=0; i<${#array[@]}; i++ ))
do
    echo "for循环遍历数组方式一: ${array[i]}"
done
echo " "

for var in ${array[@]}
do
    echo "for循环遍历数组方式二: ${var}"
done
echo " "

i=2
while [[ $i < ${#array[@]} ]]
do
    echo "while循环遍历数组: ${array[i]}"
    let i++
done

结果如下

for循环遍历数组方式一: hello
for循环遍历数组方式一: world
for循环遍历数组方式一: welcome
for循环遍历数组方式一: to
for循环遍历数组方式一: study
for循环遍历数组方式一: shell

for循环遍历数组方式二: hello
for循环遍历数组方式二: world
for循环遍历数组方式二: welcome
for循环遍历数组方式二: to
for循环遍历数组方式二: study
for循环遍历数组方式二: shell

while循环遍历数组: welcome
while循环遍历数组: to
while循环遍历数组: study
while循环遍历数组: shell

while是当变量(数组下标)小于数组长度时进入循环体,所以,没有输出hello和world

关联数组

Bash 支持关联数组,它可以使用字符串作为数组索引,关联数组一定要事先声明才行,不然会按照索引数组进行执行

使用 declare -A 来定义一个关联数组

使用${!arry[@]}来获取数组的索引列表

#!/usr/bin/env bash
declare -A city_arry=([zhangsan]=ShangHai [lisi]=BeiJing [wangwu]=GuangZhou)

for CITY in ${!city_arry[@]}
do
    echo "${CITY} come from ${city_arry[${CITY}]}"
done

通过${!city_arry[@]}将索引输出给${CITY},再通过${city_arry[${CITY}]},循环输出变量值

结果如下

zhangsan come from ShangHai
lisi come from BeiJing
wangwu come from GuangZhou
<think>好的,我现在需要帮助用户解决在Shell脚本中使用数组的问题。首先,用户的问题是如何在Shell脚本中使用数组,我需要根据提供的引用资料来构建一个清晰且正确的回答。 首先,我应该回顾用户提供的引用内容,看看有哪些关键点需要涵盖。引用[2]和[5]提到数组的定义、打印所有元素的方法,以及循环遍历数组。引用[3]提到了从文件读取数组和关联数组,引用[4]讨论了函数中处理数组,而引用[1]可能和循环有关,但看起来主要是关于Shell脚本中数组的遍历。 接下来,我需要组织回答的结构,确保覆盖数组的基本操作,比如定义、访问元素、遍历、从文件读取、关联数组以及函数中的使用。每个部分都需要简明扼要,并给出示例代码,这样用户更容易理解。 例如,定义数组部分,可以举例如array=(元素1 元素2),并说明索引从0开始。访问元素时,需要用${array[索引]},而打印全部元素可以使用${array[@]}或${array[*]},这里需要注意两者的区别,可能用户需要知道它们在不同上下文中的行为差异,但根据引用资料,可能不需要深入,只需指出可以这样使用。 循环遍历数组部分,可以使用for循环,如引用[2]中的示例,遍历每个元素并进行操作。这里可能需要展示一个简单的循环结构,比如用for item in "${array[@]}"的方式。 从文件读取数组需要注意IFS的设置,引用[3]提到处理文件中的空格或空行,可能需要调整IFS为换行符,以避免元素被错误分割。这部分需要给出具体代码示例,比如先备份原IFS,再修改,读取文件后恢复IFS。 关联数组Bash 4.0以上支持的功能,需要先声明,然后使用字符串作为键。引用[3]提到关联数组的定义,如declare -A dict,然后赋值dict["key"]=value。 在函数中传递数组,引用[4]的例子显示,可以将数组作为参数传递给函数,函数内部重新组合成数组。这可能需要将数组展开为参数列表,然后在函数内重新收集为数组。需要说明如何传递和处理,比如函数接收参数后,用newarr=($@)来重建数组。 此外,注意事项部分需要提到数组索引可能不连续,元素包含空格时要用引号包裹,以及关联数组需要Bash版本支持。这些点可能用户在实际使用中会遇到问题,提前指出可以避免错误。 最后,生成相关问题,需要基于回答内容,比如如何遍历数组、处理包含空格的元素,使用关联数组,函数传递数组等。这些问题应该覆盖用户可能进一步想了解的方面。 现在需要确保所有代码示例正确,符合Shell语法,并且引用正确。例如,定义数组元素用空格分隔,访问元素用花括号,循环中的引号使用是否正确,避免路径名扩展等问题。同时,检查引用标记是否正确添加到对应的部分,比如关联数组部分引用[3],函数处理引用[4]等。 可能需要注意的地方:当数组元素包含空格时,必须在定义时用引号包裹,否则会被拆分成多个元素。例如,array=("元素1" "包含空格的元素2"),这样在遍历时使用"${array[@]}"才能正确保留每个元素作为一个整体。这点在回答中需要强调,避免用户遇到元素分割错误。 另外,关联数组的部分需要确保用户使用的Bash版本支持,否则会报错。所以在注意事项里提醒用户检查Bash版本。 总结回答的结构,分为基本操作、遍历、文件读取、关联数组、函数使用、注意事项,每个部分配以示例代码和相关引用,最后生成相关问题。这样用户能够逐步习如何在Shell脚本中使用数组,并解决常见问题。</think>### 如何在Shell脚本中使用数组? #### 1. **数组的定义与基本操作** - **定义数组**:使用空格分隔元素,例如: ```bash array=("Debian" "Red Hat" "Ubuntu") # 索引从0开始 ``` - **访问元素**:使用`${数组名[索引]}`,例如: ```bash echo ${array[0]} # 输出第一个元素"Debian" ``` - **打印全部元素**:使用`@`或`*`符号: ```bash echo ${array[@]} # 输出所有元素[^2][^5] ``` #### 2. **遍历数组** 使用`for`循环遍历所有元素: ```bash for item in "${array[@]}"; do echo "元素: $item" done ``` 若需要索引,可结合`${!array[@]}`: ```bash for index in "${!array[@]}"; do echo "索引: $index, 值: ${array[$index]}" done ``` #### 3. **从文件读取数组** 通过命令替换读取文件内容,并设置`IFS`避免空格分割错误: ```bash IFS=$'\n' # 以换行符为分隔符 array3=($(cat /etc/passwd)) # 文件每行作为数组元素 unset IFS # 恢复默认分隔符[^3] ``` #### 4. **关联数组(键值对)** Bash 4.0+ 支持关联数组,需先声明: ```bash declare -A dict dict["name"]="Tom" dict["age"]=30 echo ${dict["name"]} # 输出"Tom"[^3] ``` #### 5. **在函数中处理数组** 将数组展开为参数传递给函数,并在函数内重组: ```bash func() { local newarr=($@) # 接收参数并重组为数组 echo "新数组: ${newarr[@]}" } arr=(1 2 3) func "${arr[@]}" # 输出"新数组: 1 2 3"[^4] ``` #### 6. **注意事项** - **索引不连续**:允许定义稀疏数组,例如: ```bash array6=(1 2 [20]="saltstack") # 索引0=1, 1=2, 20=saltstack ``` - **元素含空格**:需用引号包裹,例如: ```bash array5=("bash shell" "linux script") # 保留空格作为整体 ``` - **关联数组兼容性**:需Bash 4.0+,可通过`bash --version`检查版本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值