shell编程之数组详解

Posted givenchy_yzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之数组详解相关的知识,希望对你有一定的参考价值。

数组

一 数组介绍

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

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

二 数组的使用

2.1 数组的定义
# 方式一:array=(元素1 元素2 元素3)
array=(egon 18 male)

# 方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
array=([0]=111 [1]="two" [2]=333)

# 方式三:依次赋值
array_new[0]=111
array_new[1]=222
array_new[2]="third"

# 方式四:利用执行命令的结果设置数组元素:array=($(命令))  或者  array=(`命令`)
该方式会将命令的结果以空格为分隔符切成多个元素然后赋值给数组
[root@aliyun ~]# ls /test
a.txt	b.txt
[root@aliyun ~]# array3=(`ls /test`)
[root@aliyun ~]# declare -a |grep array3
declare -a array3='([0]="a.txt" [1]="b.txt")'


# ps:查看声明过的数组
declare -a

2.2 访问数组内元素

[root@aliyun ~]# array=(egon 18 male)

#1、按照索引访问数组内指定位置的元素
[root@aliyun ~]# echo ${array[0]}
egon
[root@aliyun ~]# echo ${array[1]}
18
[root@aliyun ~]# echo ${array[2]}
male
[root@aliyun ~]# echo ${array[-1]}  # 支持负向索引
male


# 2、访问数组内全部元素信息
[root@aliyun ~]# echo ${array[*]}
egon 18 male
[root@aliyun ~]# echo ${array[@]}
egon 18 male

# 3、获取数组元素的长度
[root@aliyun ~]# echo ${#array[*]}
3
[root@aliyun ~]# echo ${#array[@]}
3
2.3 修改/添加数组元素
[root@aliyun ~]# array=(egon 18 male)
[root@aliyun ~]# array[0]="EGON"  # 修改
[root@aliyun ~]# array[3]="IT"  # 添加
[root@aliyun ~]# declare -a |grep array
declare -a array='([0]="EGON" [1]="18" [2]="male" [3]="IT")'
2.4 删除数组元素
[root@aliyun ~]# unset array[0]
[root@aliyun ~]# echo ${array[*]}
18 male IT
[root@aliyun ~]# declare -a |grep array
declare -a array='([1]="18" [2]="male" [3]="IT")'
[root@aliyun ~]# 
[root@aliyun ~]# 
[root@aliyun ~]# unset array[2]
[root@aliyun ~]# declare -a |grep array
declare -a array='([1]="18" [3]="IT")'

[root@aliyun ~]# unset array  # 删除整个数组
[root@aliyun ~]# echo ${array[*]}
2.5 数组内元素的截取
[root@aliyun ~]# array=(egon 18 male IT 1.80)
[root@aliyun ~]# echo ${array[*]:1}    # 从索引1开始,一直到最后
18 male IT 1.80
[root@aliyun ~]# echo ${array[*]:1:3}  # 从索引1开始,访问3个元素
18 male IT

[root@aliyun ~]# array=(one two three four five fire)
[root@aliyun ~]# echo ${array[*]#one}
two three four five fire
[root@aliyun ~]# echo ${array[*]#f*e}
one two three four
2.6 数组内容的替换
[root@aliyun ~]# array=(one two three four five fire)

[root@aliyun ~]# echo ${array[*]/five/abc}
one two three four abc fire

[root@aliyun ~]# echo ${array[*]/f*e/abc}
one two three four abc abc

三 关联数组

数组分为两种

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

声明关联数组

[root@aliyun ~]# declare -A info
[root@aliyun ~]# info["name"]="egon"
[root@aliyun ~]# info["age"]=18
[root@aliyun ~]# info["gender"]="male"
[root@aliyun ~]# 
[root@aliyun ~]# declare -A |grep info
declare -A info='([gender]="male" [name]="egon" [age]="18" )'
[root@aliyun ~]# 
[root@aliyun ~]# echo ${info[*]}
male egon 18
[root@aliyun ~]# 
[root@aliyun ~]# echo ${info["name"]}
egon

四 遍历数组

方法一: 利用获取所有信息进行遍历 (适用于普通数组与关联数组)

# 例1
declare -A array
array=(["name"]="egon" ["age"]=18 ["gender"]="male")

for item in ${array[*]}
do 
    echo $item
done

# 例2
array=("egon" 18 "male")
for item in ${array[*]}
do 
    echo $item
done

方法二: 通过数组元数的索引进行遍历(适用于普通数组与关联数组)

# 例1
declare -A array
array=(["name"]="egon" ["age"]=18 ["gender"]="male")

for i in ${!array[*]}  # echo ${!array[*]}  # 获取的是key信息:name age gender
do 
    echo "$i:${array[$i]}"
done

# 例2
array=("egon" 18 "male")
for i in ${!array[*]}  # echo ${!array[*]} 直接获取所有元素的索引信息
do 
    echo $i
    echo ${array[i]}
done

方法三:根据数组长度信息进行遍历,(适用于普通数组)

array=("egon" 18 "male")

for ((i=0;i<${#array[*]};i++))
do 
    echo "$i:${array[$i]}"
done

五 练习

练习1:对指定的IP地址进行网络测试

练习2: 统计登录shell的种类及对应的个数(关联数组)

练习3:获取文件指定列的信息

以上是关于shell编程之数组详解的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程入门

Shell编程之特殊变量(详解)

Shell编程之变量(详解)

Shell编程之Expect免交互语句详解

shell编程之数组

Shell编程之数组