1.数组定义方法
Shell数组:Shell数组定义以及获取数组元素
和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组
Shell 数组的定义
Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:
array_name=(ele1 ele2 ele3 … elen)
注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素
(1)
[root@base1 mnt]# array=(1 2 3) # 定义数组
[root@base1 mnt]# echo ${array[*]} # 输出数组中的所有
1 2 3
(2)
[root@base1 mnt]# array=([1]=one [2]=two [3]=three) # 自己定义数组元素的下标
root@base1 mnt]# echo ${array[*]}
one two three
(3)
[root@base1 mnt]# array[0]=a
[root@base1 mnt]# array[1]=b
[root@base1 mnt]# array[2]=c
[root@base1 mnt]# array[3]=d
[root@base1 mnt]# echo ${array[0]}
a
[root@base1 mnt]# echo ${array[2]}
c
[root@base1 mnt]# echo ${array[*]}
a b c d
(4)动态定义数组变量并使用命令的输出结果作为数组的内容
[root@base1 mnt]# mkdir /array -p
[root@base1 mnt]# touch /array/{1..3}.txt
[root@base1 mnt]# ls /array/
1.txt 2.txt 3.txt
[root@base1 mnt]# array=($(ls /array)) # 把ls /array的输出结果作为数组的值
[root@base1 mnt]# echo ${array[*]} # 打印数组
1.txt 2.txt 3.txt
2.数组的打印和输出
(1)打印数组元素
[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# echo ${array[0]} # 默认第一个元素的下标是0
one
[root@base1 mnt]# echo ${array[1]}
two
[root@base1 mnt]# echo ${array[@]} # 打印数组全部元素,@和*是一样的效果
one two three
(2)打印元素个数
[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# echo ${#array[@]}
3
[root@base1 mnt]# echo ${#array[*]}
3
(3)数组的赋值
如果下标不存在,则自动添加一个新元素,如果存在,则覆盖原来的值
[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# array[3]=four
[root@base1 mnt]# echo ${array[*]}
one two three four
[root@base1 mnt]# array[0]=hello # 重新定义下标为0的数组元素
[root@base1 mnt]# echo ${array[*]} # 查看定义成功
hello two three four
[root@base1 mnt]# echo ${array[@]:1:3} # 打印下标为1开始的3个数组元素
two three four
[root@base1 mnt]# array=(1 2 3 1 3)
[root@base1 mnt]# echo ${array[*]}
1 2 3 1 3
[root@base1 mnt]# echo ${array[*]/1/a} # 把数组中所有的1替换成为a
a 2 3 a 3
[root@base1 mnt]# array=(1 2 3 1 3)
[root@base1 mnt]# unset array[1] # 删除下标为1的数组元素
[root@base1 mnt]# echo ${array[*]}
1 3 1 3
[root@base1 mnt]# unset array # 删除所有的数组元素
[root@base1 mnt]# echo ${array[*]}
练习1:用循环输出数组中元素的下标
[root@base1 mnt]# vim shuzu_xiabiao.sh
#!/bin/bash
array=(7 3 4 6 2)
for ((i=0;i<${#array[*]};i++))
do
echo $i
done
练习2:用for循环打印下面这句话中字母个数不大于6的单词
I am westos teacher welcome to westos training class
[root@base1 mnt]# vim shuzu_bianli.sh
#!/bin/bash
array=(I am westos tescher welcome to westos training class) # 定义数组元素
for ((i=0;i<${#array[@]};i++)) # 循环遍历数组元素
do
if [ ${#array[$i]} -lt 6 ];then # 在数组元素中继续遍历,统计数组中每个元素的个数
echo ${array[$i]}
fi
done
练习3 通过竖向列举法定义数组元素并批量打印
[root@ci-node1 scripts]# cat 16.sh
#!/bin/bash
arrary=(
oldboy
oldgirl
xiaoting
binggin
)
for ((i=0;i<${#arrary[*]};i++))
do
echo "This is num $i,then content is ${arrary[i]}"
done
练习4 把命令结果作为数组元素定义并打印
[root@ci-node1 scripts]# cat 17.sh
#!/bin/bash
arrary=(`ls /oldboy`)
for ((i=0;i<${#arrary[*]};i++))
do
echo "This is num $i,then content is ${arrary[i]}"
done
echo --------------------
arrary1=($(ls /oldboy))
num=0
for i in ${arrary1[*]}
do
echo "This is num $num,then content is $i"
((num++))
done