Shell入门-Shell数组
Shell数组
通常在开发Shell脚本时,定义变量采用的形式为“a=1; b=2; c=3”,可如果有多个变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生了,它就是为了解决上述问题而出现的
Shell数组的定义
方法一:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格进行分隔
语法:
array=(arg1 arg2 arg3)
实践:
[root@localhost shell]# array=(1 2 3)
[root@localhost shell]# echo ${array[*]}
1 2 3
方法二:用小括号将变量值括起来,同时采用键值对的形式赋值
语法:
array=([1]=one [2]=two [3]=three)
实践:
[root@localhost shell]# array=([1]=one [2]=two [3]=three)
[root@localhost shell]# echo ${array[*]}
one two three
[root@localhost shell]#
方法三:通过分别定义数组变量的方法来定义
语法:
array[0]=a;array[1]=b;array[2]=c
实践:
[root@localhost shell]# array[0]=a;array[1]=b;array[2]=c
[root@localhost shell]# echo ${array[*]}
a b c three
[root@localhost shell]#
方法四:动态定义数组变量,使用命令的输出内容作为数组内容
语法:
array=($(命令))
或
array=(`命令`)
实践:
[root@localhost shell]# ls stu*
stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg
[root@localhost shell]# array=($(ls stu*))
[root@localhost shell]# echo ${array[*]}
stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg
[root@localhost shell]#
Shell数组的打印
1.打印数组元素
[root@localhost shell]# array=(one two three)
[root@localhost shell]# echo ${array[0]}
one
[root@localhost shell]# echo ${array[1]}
two
[root@localhost shell]# echo ${array[2]}
three
[root@localhost shell]# echo ${array[*]}
one two three
[root@localhost shell]# echo ${array[@]}
one two three
[root@localhost shell]#
2.打印数组元素的个数
[root@localhost shell]# echo ${#array[*]}
3
[root@localhost shell]# echo ${#array[@]}
3
[root@localhost shell]#
3.数组赋值
可直接通过“数组名[下标]”对数组进行引用赋值,如果下标不存在,则自动添加一个新的数组元素,如果下标存在,则覆盖原来的值。
[root@localhost shell]# array[2]=four
[root@localhost shell]# echo ${array[@]}
one two four
4.数组的删除
因为数组本质上还是变量,因此可通过“unset数组[下标]”清除相应的数组元素,如果不带下标,则表示清除整个数组的所有数据。
[root@localhost shell]# unset array[2]
[root@localhost shell]# echo ${array[@]}
one two
[root@localhost shell]# unset array
[root@localhost shell]# echo ${array[@]}
[root@localhost shell]#
5.数组内容的截取和替换
这里和前文变量子串的替换是一样的,因为数组是特殊的变量。
echo ${array[@]:0:2}
表示从array数组的下标0开始获取2个元素
[root@localhost shell]# array=(1 2 3 4 5)
[root@localhost shell]# echo ${array[@]:1:3}
2 3 4
[root@localhost shell]# array=($(echo {a..z}))
[root@localhost shell]# echo ${array[@]}
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
[root@localhost shell]# echo ${array[@]:1:3}
b c d
[root@localhost shell]# echo ${array[@]:0:3}
a b c
[root@localhost shell]# echo ${array[@]:0:2}
a b
[root@localhost shell]#
替换:
[root@localhost shell]# echo ${array[@]/a/1}
1 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
提示:调用方法为${数组名[@或*]/查找字符/替换字符},该操作不会改变原先数组的内容,如果需要修改,可以参考上面的例子,重新定义数组。
删除数组元素:
[root@localhost shell]# array=(one two three four five)
[root@localhost shell]# echo ${array[@]}
one two three four five
[root@localhost shell]# echo ${array[@]#o*}
ne two three four five <===从左边开始匹配最短的数组元素,并删除
[root@localhost shell]# echo ${array[@]##o*}
two three four five <===从左边开始匹配最长的数组元素,并删除
[root@localhost shell]# echo ${array[@]%f*}
one two three <===从右边开始匹配最短的数组元素,并删除
[root@localhost shell]# echo ${array[@]%%f*}
one two three <===从右边开始匹配最长的数组元素,并删除
[root@localhost shell]#
提示:数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。数组的其他相关知识可通过man bash命令然后搜“Arrays”来了解。
Shell数组实践
使用循环批量输出数组的元素
方法一:通过c语言型的for循环语句打印数组元素
[root@localhost shell]# cat 13_1_1.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-16
#FileName: 13_1_1.sh
#Description: This is a test script.
#***********************************************
array=(1 2 3 4 5)
for((i=0;i<${#array[*]};i++))
do
echo ${array[i]}
done
[root@localhost shell]# sh 13_1_1.sh
1
2
3
4
5
方法二:通过普通for循环语句打印数组元素
[root@localhost shell]# cat 13_1_2.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-16
#FileName: 13_1_2.sh
#Description: This is a test script.
#***********************************************
array=(1 2 3 4 5)
for n in ${array[*]}
do
echo $n
done
[root@localhost shell]# sh 13_1_2.sh
1
2
3
4
5
方法三:使用while循环语句打印数组元素
[root@localhost shell]# cat 13_1_3.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-16
#FileName: 13_1_3.sh
#Description: This is a test script.
#***********************************************
array=(1 2 3 4 5)
i=0
while (( i<${#array[*]} ))
do
echo ${array[i]}
((i++))
done
[root@localhost shell]# sh 13_1_3.sh
1
2
3
4
5
通过竖向列举法定义数组元素并批量打印。
[root@localhost shell]# sh 13_2_1.sh
this is num 0,then content is oldboy
this is num 1,then content is oldgirl
this is num 2,then content is xiaoting
this is num 3,then content is bingbing
-----------------------------------
array len:4
[root@localhost shell]# cat 13_2_1.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-16
#FileName: 13_2_1.sh
#Description: This is a test script.
#***********************************************
array=(
oldboy
oldgirl
xiaoting
bingbing
)
for (( i=0;i<${#array[*]};i++ ))
do
echo "this is num $i,then content is ${array[$i]}"
done
echo -----------------------------------
echo "array len:${#array[*]}"
打印字母数不大于6的单词
利用bash for循环打印下面这句话中字母数不大于6的单词i am oldboy teacher welcome to oldboy training class
1.先把所有单词放入数组中,然后依次进行判断
array=(i am oldboy teacher welcome to oldboy training class)
2.计算变量内容的长度,常见有4种方法
[root@localhost shell]# char=oldboy
[root@localhost shell]# echo $char|wc -L
6
[root@localhost shell]# echo ${#char}
6
[root@localhost shell]# expr length $char
6
[root@localhost shell]# echo $char|awk '{print length ($0)}'
6
[root@localhost shell]#
或者使用awk循环实现
[root@localhost shell]# array="i am oldboy teacher welcome to oldboy training class"
[root@localhost shell]# echo $array|awk '{for(i=1;i<=NF;i++) if(length($i)<=6) print $i}'
i
am
oldboy
to
oldboy
class
[root@localhost shell]#