bash中的数组

本文详细介绍了Bash中的数组使用,包括索引数组和关联数组的定义及注意事项,如处理带有空格的元素。此外,还讲解了如何将数组作为函数参数传递,以及如何在函数中获取特定位置的参数。对于Bash 4及以上版本,重点介绍了declare -A声明关联数组的方法,并提供了实际应用示例。

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

1 索引数组

#定义:
array=(1 "two" 3 "four")
array[index]=value

#访问数组元素(array必须用大括号括起来):
${array[${index}]}

# 获取数组所有元素(元素之间以空格分隔)
${array[@]}

# 获取数组长度
${#array[@]}

# 按下标遍历
for i in $(seq $((${#array[@]}-1)));
do
    echo $i, ${array[$i]};
done

# 按元素遍历(必须加双引号)
for var in "${array[@]}"

注:

  • @也可以换成*,建议使用@
  • array[“123”]定义的是索引数组,按理说索引数组应该是下标都是整数

  • 如果处理数组元素带空格的情况,bash会对”${array[@]}”情况下每个数组元素都加上双引号,确保元素中的空格不会被for识别为元素之间的分隔符

2 关联数组

# 定义
fruit_value=(["apple"]=3 ["an orange"]="three")
fruit_value[index]=value

# 访问数组元素
${fruit_value["apple"]}
${fruit_value["${fruit}"]}

# 获得所有key
${!fruit_value[@]}

# 获得所有value
${fruit_value[@]}

# 按key遍历关联数组
for var in "${!array[@]}"

注:

  • 推荐用@,”${!array[*]}”是对整个数组加双引号,而”{!array[@]}”是对每个key加双引号
  • 遍历数组时双引号必须加,如果key有空格可以正确分割
  • bash 4以上的版本才支持declare -A声明关联数组,bash 3有很多trick的做法,见参考

例:统计文件类型信息。

#!/bin/bash
if [ $# -ne 1 ];
then
    echo "Usage: filetype_analyzer.sh path"
    exit -1
fi
declare -A types
for file in `ls $1`
do
    type=`file $file -b | cut -d, -f1`
    let types["$type"]++
    #echo $file, $type, ${types[$type]}
done
for type in "${!types[@]}"
do
    echo $type ":" ${types["$type"]}
done

3 数组作为函数参数

3.1 一个数组

get_nth_array_element的位置参数含义:

  1. $1:返回数组第几个元素(从0开始)
  2. 2" {array[@]}”把数组元素转换成”array[0]” “array[1]” … “array[n-1]”,可以正确处理数组元素中有空格的情况。实际上函数接受了1+len(array)个位置参数

偏移关系:array[0]是 22 {!(i+2)}为array[i]

3.2 两个数组

get_nth_array_element的位置参数含义:

  1. 1array1[ 1]
  2. 2array2[ 2]
  3. $3:len(array1)
  4. $4:array1[0]
  5. $(n+4):array2[0]

偏移关系: 3n 4- n+41 (n+4)就是第二个数组[0]元素

3.3 eval

#获得第n个数组的[m]索引元素
eval var=\${$n[m]}

3.4 获得函数nth的位置参数(补充)

  • !nnn n功能相同。n也可以是一个变量,获得指定位置的参数,n前面不用加$。
  • ${!n}中的n不能是表达式,如果第几个参数需要通过计算得到,那么把计算结果保存到一个局部变量i中,然后{!i}获取参数。

参考

  1. How to define hash tables in bash?
  2. Passing multiple distinct arrays to a shell function
  3. How to get the nth positional argument in bash?
### 如何在Bash脚本中遍历数组Bash脚本中,可以通过多种方式来定义和遍历数组。以下是几种常见的方法: #### 使用 `for` 循环遍历数组 可以利用 `for` 循环逐一访问数组中的每个元素。下面是一个简单的例子展示如何实现这一点。 ```bash #!/bin/bash # 定义一个数组 array=("foo" "bar" "baz") # 遍历数组并打印每个元素 for element in "${array[@]}"; do echo "$element" done ``` 上述代码片段展示了如何通过 `${array[@]}` 来获取整个数组的内容,并将其逐一遍历[^1]。 #### 结合索引遍历数组 如果需要知道当前处理的是哪个索引位置上的元素,则可以采用如下形式的循环结构。 ```bash #!/bin/bash # 定义一个数组 array=("foo" "bar" "baz") # 获取数组长度并通过索引来迭代 for index in "${!array[@]}"; do echo "Index $index: ${array[$index]}" done ``` 这里使用 `"${!array[@]}"` 表达式返回所有的键值(即索引),从而允许基于这些索引去访问对应的数组项。 #### 处理命令行参数作为数组 当接收来自用户的输入时,通常会将它们视为一种特殊的数组 `[email protected]` 或 `$@` 。这使得我们可以轻松地对用户提供的一系列参数执行相同的操作。 ```bash #!/bin/bash echo "All arguments:" for arg in "[emailprotected]"; do echo "- Argument: '$arg'" done ``` 这段程序能够接受任意数量的参数并将每一个单独显示出来[^2]。 #### 实际应用案例分析 考虑这样一个场景——我们需要读取字符串列表并转换成数组再做进一步操作。比如分离逗号分隔符后的单词存入数组里头。 ```bash #!/bin/bash string="one,two,three,four" # 将字符串按指定字符拆分成数组 IFS=',' read -r -a my_array <<< "$string" # 输出结果验证效果 printf "%s\n" "${my_array[@]}" ``` 此实例说明了怎样把一段连续文字依据特定标志位切割开来形成新的数据集合。 --- #### 注意事项 - 当涉及到文件路径或者特殊符号较多的情况下,请记得适当转义以免引起不必要的错误。 - 对于大型项目而言,建议合理规划函数模块化设计思路以便后期维护更加便捷高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值