5shell中的数组

0.理解数组

(1)shell不限制数组的大小,数组元素的下标从0开始计数

(2)获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式,但是下标必须大于等于0

(3)bash shell只支持一维数组,不支持多维数组

1.数组的定义

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:

array_name=(ele1  ele2  ele3 ... elen)

注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

情形
脚本
解释
定义数组
  1. nums=(29 100 13 91 44)

echo ${nums[*]}----->29 100 13 8 91 44

Shell 是弱类型的,它并不要求所有数组元素的类型必须相同
  1. arr=(20 56 "http://c.biancheng.net/shell/")
第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。
Shell 数组的长度不是固定的,定义之后还可以增加元素
  1. nums=(29 100 13 91 44)
  2. nums[6]=88

echo ${nums[*]}------>9 100 13 8 91 44 88

无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:

  1. ages=([3]=24 [5]=19 [10]=12)

以上代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。

  • echo ${ages[3]}------->24
  • echo ${ages[4]}------->空
  • echo ${ages[5]}-----→19
  • echo ${ages[11]}------>空

注意到虽然数组长度是3,但是该数组只在指定位置有真实值,其他位置的值都为空,即使下标位置越界,其值依然为空,不会报错

2.获取数组元素

获取数组元素的值,一般使用下面的格式:${array_name[index]},其中,array_name 是数组名,index 是下标。

情形
脚本
结果
获取数组第二个元素 echo ${nums[2]}  
使用@*可以获取数组中的所有元素

echo ${nums[*]}

echo ${nums[@]}

 
举栗
  1. #!/bin/bash
  2. nums=(1 3 5 7)
  3. echo '输出所有数组元素:'${nums[*]}
  4. echo '输出第2个元素:'${nums[2]}
  5. nums[5]=8#给第5个元素赋值(此时会增加数组长度)
  6. echo '输出第3个元素:'${nums[3]}
  7. echo '输出第4个元素:'${nums[4]}
  8. echo '输出第5个元素:'${nums[5]}
  9. echo '输出所有数组元素:'${nums[@]}
运行结果:

输出所有数组元素:1 3 5 7

输出第2个元素:5

输出第3个元素:7

输出第4个元素:

输出第5个元素:8

输出所有数组元素:1 3 5 7 8

3.计算数组长度

数组长度,即数组元素的个数,可以使用#来获取数组元素的个数。

情形
脚本
结果
使用#来获取数组元素的个数 ${#array_name[@]}
${#array_name[*]}
 
获取指定下标位置的元素长度

获取 arr 数组的第 2 个元素(假设它是字符串)的长度。

${#arr[2]} 

 
字符串长度的获取方式 ${#string_name}  
举栗
  1. #!/bin/bash
  2. nums=(1 3 5 7)

  3. echo '输出数组的长度:'${#nums[*]}

  4. var1='qwertyuiop'

  5. echo '字符串长度:'${#var1}

  6. nums[8]=${var1}

  7. echo '输出数组的长度:'${#nums[@]}

  8. echo '第1个元素的长度:'${#nums[1]}

  9. echo '第8个元素的长度:'${#nums[8]}

  10. unset nums[1]#删除元素

  11. echo '输出数组的长度:'${#nums[@]}

运行结果:

输出数组的长度:4

字符串长度:10

输出数组的长度:5

第1个元素的长度:1

第8个元素的长度:10

输出数组的长度:4

4.拼接数组

所谓 Shell 数组拼接就是将两个数组连接成一个数组。
拼接数组的思路是:先利用@*,将数组扩展成列表,然后再合并到一起。具体格式如下:

array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

举栗
结果
  1. #!/bin/bash
  2. arr1=(1 2)
  3. arr2=(qwer tyui)
  4. array_new1=(${arr1[*]} ${arr2[@]})
  5. array_new2=(${arr1[@]} ${arr2[*]})
  6. echo ${array_new1[*]}
  7. echo ${array_new2[@]}
运行结果:

1 2 qwer tyui

1 2 qwer tyui

5.删除数组元素或数组

情形
脚本
结果
使用 unset 关键字来删除数组元素 unset array_name[index]  
删除整个数组 unset array_name  
举栗
  1. #!/bin/bash
  2. arr=(23 56 99 66 )
  3. unset arr[1]
  4. echo ${arr[@]}
  5. unset arr
  6. echo ${arr[*]}

运行结果:

23 99 66

 

注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出为空

6.关联数组

shell中的关联数组类似于Python中字典的概念,关联数组也成为键值对数组,键(key)即数组的下标,值(value)即元素值。

6.1 创建关联数组

创建关联数组必须使用带有-A选项的 declare 命令

情形
脚本
新定义后赋值
  1. declare -A people
  2. color['num1']=xiaohong
  3. color[num2]=xiaobai
  4. color["num3"]=xiaohei
定义时同时赋值
  1. declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)

6.2 访问关联数组元素

情形
脚本
结果
获取关联数组的元素值 $(array_name["index"])

echo ${people[num1]}-----> xiaohong

获取所有元素的下标 ${!array_name[@]}
${!array_name[*]}

echo ${people[*]}----->xiaohong xiaobai xiaohei

echo ${people[@]}----->xiaohong xiaobai xiaohei

获取所有元素的值 ${array_name[@]}
${array_name[*]}

echo ${!people[*]}-----> num1 num2 num3

echo ${!people[@]}-----> num1 num2 num3

获取关联数组长度

与获取普通数组长度的方式相同

${#array_name[*]}
${#array_name[@]}

echo ${#people[*]}-----> 3

echo ${#people[@]}-----> 3

举栗
  1. #!/bin/bash
  2. declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)
  3. echo '联合数组的key值为:'${!people[*]}
  4. echo '联合数组元素值为:'${people[*]}
  5. echo '联合数组的长度为:'${#people[@]}
  6. echo '循环打印联合数组的key值'
  7. for item in ${!people[@]}
  8. do
  9. echo ${item}
  10. done
  11.  
  12. echo '循环打印联合数组的元素值'
  13. for item in ${people[*]}
  14. do
  15. echo ${item}
  16. done
  17.  
  18. echo '循环打印联合数组的键值对'
  19. for item in ${!people[@]}
  20. do
  21. echo ${item}-->${people[$item]}
  22. done
运行结果:
  • 联合数组的key值为:num1 num2 num3
  • 联合数组元素值为:xiaohong xiaobai xiaohei
  • 联合数组的长度为:3
  • 循环打印联合数组的key值
  • num1
  • num2
  • num3
  • 循环打印联合数组的元素值
  • xiaohong
  • xiaobai
  • xiaohei
  • 循环打印联合数组的键值对
  • num1-->xiaohong
  • num2-->xiaobai
  • num3-->xiaohei

总结:

1、定义 list1=(a b c)
2、获取item个数: ${#list1[@]} ${#list1[*]}
3、获取某个item:${list1[0]},${list1[1]}
4、转换成以空格分隔各item的字符串: str=${list1[*]} str=${list1[@]}
5、把以空格分隔的字符串转换成list:str="a b c"; list1=($str); echo ${#list1[@]};

 
原文地址:https://www.cnblogs.com/mianbaoshu/p/12069491.html