第十一章 Shell数组

1 数组介绍

1.1 什么是数组

  1. 数组就是一系列元素的集合,一个数组内可以存放多个元素

1.2 为何要用数组

  1. 我们可以用数组将多个元素汇总到一起,避免单独定义的麻烦

2 数组的使用

2.1 数组的定义

  1. # 方式一:array=(元素1 元素2 元素3)
  2. array=(xujun 18 male)
  3. # 方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
  4. array=([0]=111 [1]="two" [2]=333)
  5. # 方式三:依次赋值
  6. array_new[0]=111
  7. array_new[1]=222
  8. array_new[2]="third"
  9. # 方式四:利用执行命令的结果设置数组元素:array=($(命令)) 或者 array=(`命令`)
  10. 该方式会将命令的结果以空格为分隔符切成多个元素然后赋值给数组
  11. [root@aliyun ~]# ls /test
  12. a.txt b.txt
  13. [root@aliyun ~]# array3=(`ls /test`)
  14. [root@aliyun ~]# declare -a |grep array3
  15. declare -a array3='([0]="a.txt" [1]="b.txt")'
  16. # ps:查看声明过的数组
  17. declare -a

2.2 访问数组元素

  1. [root@aliyun ~]# array=(xujun 18 male)
  2. #1、按照索引访问数组内指定位置的元素
  3. [root@aliyun ~]# echo ${array[0]}
  4. xujun
  5. [root@aliyun ~]# echo ${array[1]}
  6. 18
  7. [root@aliyun ~]# echo ${array[2]}
  8. male
  9. [root@aliyun ~]# echo ${array[-1]} # 支持负向索引
  10. male
  11. # 2、访问数组内全部元素信息
  12. [root@aliyun ~]# echo ${array[*]}
  13. xujun 18 male
  14. [root@aliyun ~]# echo ${array[@]}
  15. xujun 18 male
  16. # 3、获取数组元素的长度
  17. [root@aliyun ~]# echo ${#array[*]}
  18. 3
  19. [root@aliyun ~]# echo ${#array[@]}
  20. 3

2.3 修改/添加数组元素

  1. [root@aliyun ~]# array=(xujun 18 male)
  2. [root@aliyun ~]# array[0]="EGON" # 修改
  3. [root@aliyun ~]# array[3]="IT" # 添加
  4. [root@aliyun ~]# declare -a |grep array
  5. declare -a array='([0]="EGON" [1]="18" [2]="male" [3]="IT")'

2.4 删除数组元素

  1. [root@aliyun ~]# declare -a |grep array
  2. declare -a array='([1]="18" [2]="male" [3]="IT")'
  3. [root@aliyun ~]# unset array[2]
  4. [root@aliyun ~]# declare -a |grep array
  5. declare -a array='([1]="18" [3]="IT")'
  6. [root@aliyun ~]# unset array # 删除整个数组
  7. [root@aliyun ~]# echo ${array[*]}

2.5 对数组进行切片

  1. [root@aliyun ~]# array=(egon 18 male IT 1.80)
  2. [root@aliyun ~]# echo ${array[*]:1} # 从索引1开始,一直到最后
  3. 18 male IT 1.80
  4. [root@aliyun ~]# echo ${array[*]:1:3} # 从索引1开始,访问3个元素
  5. 18 male IT
  6. [root@aliyun ~]# array=(one two three four five fire)
  7. [root@aliyun ~]# echo ${array[*]#one}
  8. two three four five fire
  9. [root@aliyun ~]# echo ${array[*]#f*e}
  10. one two three four

2.6 数组内容进行替换

  1. [root@aliyun ~]# array=(one two three four five fire)
  2. [root@aliyun ~]# echo ${array[*]/five/abc}
  3. one two three four abc fire
  4. [root@aliyun ~]# echo ${array[*]/f*e/abc}
  5. one two three four abc abc

3 关联数组

数组中分为两种

  • 普通数组:使用整数作为数组索引,前面的都是普通数组
  • 关联数组:可以使用字符串作为数组索引,需要用declare -A声明

3.1 声明关联数组

  1. [root@aliyun ~]# declare -A info
  2. [root@aliyun ~]# info["name"]="egon"
  3. [root@aliyun ~]# info["age"]=18
  4. [root@aliyun ~]# info["gender"]="male"
  5. [root@aliyun ~]# declare -A |grep info
  6. declare -A info='([gender]="male" [name]="egon" [age]="18" )'
  7. [root@aliyun ~]# echo ${info[*]}
  8. male egon 18
  9. [root@aliyun ~]# echo ${info["name"]}
  10. egon

4 遍历数组

  1. #方法一:利用获取所有信息进行遍历
  2. array=("egon" 18 "male")
  3. for item in ${array[*]}
  4. do
  5. echo $item
  6. done
  7. #方法二:通过数组元数的索引进行遍历
  8. array=("egon" 18 "male")
  9. for i in ${!array[*]} # echo ${!array[*]} 直接获取所有元素的索引信息
  10. do
  11. echo $i
  12. echo ${array[i]}
  13. done
  14. #方法三:根据数组长度信息进行遍历
  15. array=("egon" 18 "male")
  16. for ((i=0;i<${#array[*]};i++))
  17. do
  18. echo "$i:${array[$i]}"
  19. done

5 练习题

  1. #练习1:对指定的IP地址进行网络测试
  2. #!/bin/bash
  3. array=(
  4. 10.0.0.7
  5. 10.0.0.8
  6. 10.0.0.9
  7. 10.0.0.41
  8. )
  9. for info in ${array[*]}
  10. do
  11. ping -c 2 -W 1 $info
  12. done
  1. #练习2:统计登录shell的种类及对应的个数
  2. #!/bin/bash
  3. declare -A array_for_shell
  4. while read line # done后面接<将文件重定向给while;while后再接read将文件流赋值给变量
  5. do
  6. login_shell=`echo $line | cut -d: -f7`
  7. let array_for_shell["$login_shell"]++ # 当使用let时,变量前面不必加上$
  8. done < /etc/passwd
  9. for k in ${!array_for_shell[*]}
  10. do
  11. echo $k:${array_for_shell[$k]}
  12. done