本文主要讲解Shell脚本开发中数组的知识与实践

目录:

  1.Shell数组介绍

  2.Shell数组的定义与常用实践

  3.Shell数组脚本开发实践

  4.shell数组的重要命令

  5.Shell数组相关面试题实战  




一:Shell数组介绍

1)Shell数组产生的缘由

  通常在开发shell脚本时,定义变量采用的形式为"a=1;b=2;c=3",可如果有多个变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生了,它就是为了解决上诉问题而出现的。


2)什么是Shell数组

  简单地说,Shell数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。

  有了Shell数组之后,就可以用相同名字来引用一系列变量及变量值了,并通过数字(索引)来识别使用它们。在很多场合中,使用数组可以缩短和简化程序开发。




二:Shell数组的定义与增删改查

1)Shell数组的定义的多种方法

法1:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格进行分割。

语法如下:

array=(value1 value2 value3 ...)
示例如下:
[root@aliyun shuzu]# array=(1 2 3) 
[root@aliyun shuzu]# echo ${array[*]}
1 2 3
#最常见的定义数组方法


法2:用小括号将变量值括起来,同时采用键值对的形式赋值。

语法如下:

array=([1]=one [2]=tow [3]=three)
示例如下:
[root@aliyun shuzu]# array=([1]=one [2]=tow [3]=three)
[root@aliyun shuzu]# echo ${array[*]}                 
one tow three
[root@aliyun shuzu]# echo ${array[1]}
one
[root@aliyun shuzu]# echo ${array[2]}
tow
#此法比较复杂,不推荐使用


法3:通过分别定义数组变量的方法来定义。

语法如下:

array[0]=a;array[1]=b,array[2]=c
示例如下:
[root@aliyun shuzu]# array[0]=a
[root@aliyun shuzu]# array[1]=b
[root@aliyun shuzu]# array[2]=c
[root@aliyun shuzu]# echo ${array[0]}
a
[root@aliyun shuzu]# echo ${array[1]}
b
[root@aliyun shuzu]# echo ${array[2]}
c
#此法比较复杂,不推荐使用


法4:动态地定义数组变量,并使用命令的输出结果作为数组的内容。

array=($(命令))  或  array=(`命令`)
示例如下:
[root@aliyun shuzu]# touch ywxi{1..3}.txt
[root@aliyun shuzu]# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi1.txt
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi2.txt
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi3.txt
[root@aliyun shuzu]# array=($(ls))   
[root@aliyun shuzu]# echo ${array[*]}
ywxi1.txt ywxi2.txt ywxi3.txt
[root@aliyun shuzu]# array=(`ls`)
[root@aliyun shuzu]# echo ${array[*]}
ywxi1.txt ywxi2.txt ywxi3.txt
#此法经常被使用


2)Shell数组的定义与常用实践

1.打印数组元素

示例如下:

[root@aliyun shuzu]# array=(one two three)
[root@aliyun shuzu]# echo ${array[0]}
one
[root@aliyun shuzu]# echo ${array[1]}
two
[root@aliyun shuzu]# echo ${array[*]}
one two three
[root@aliyun shuzu]# echo ${array[@]}
one two three


2.打印数组元素的个数

示例如下:

[root@aliyun shuzu]# echo ${array[*]} 
one two three
[root@aliyun shuzu]# echo ${array[@]}
one two three
[root@aliyun shuzu]# echo ${#array[@]}
3
[root@aliyun shuzu]# echo ${#array[*]}
3


3.数组赋值(不常用,了解即可)

[root@aliyun shuzu]# array=(one two three)
[root@aliyun shuzu]# echo ${array[*]}
one two three
[root@aliyun shuzu]# array[3]=four
[root@aliyun shuzu]# echo ${array[*]}
one two three four
[root@aliyun shuzu]# array[0]=ywxi
[root@aliyun shuzu]# echo ${array[*]}
ywxi two three four


4.数组的删除

[root@aliyun shuzu]# echo ${array[*]}
ywxi two three four
[root@aliyun shuzu]# unset array[1]        #取消下标为1的数组元素
[root@aliyun shuzu]# echo ${array[*]}      #可以看见元素“two”不见了
ywxi three four
[root@aliyun shuzu]# unset array
[root@aliyun shuzu]# echo ${array[*]}      #删除整个数组

[root@aliyun shuzu]#


5.数组内容的截取和替换

这里和变量子串的替换是一样的,因为数组是特殊的变量。

[root@aliyun shuzu]# array=(1 2 3 4 5)
[root@aliyun shuzu]# echo ${array[@]:1:3}
2 3 4
[root@aliyun shuzu]# array=(`echo {a..z}`)
[root@aliyun shuzu]# 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@aliyun shuzu]# echo ${array[*]:1:3}
b c d
[root@aliyun shuzu]# echo ${array[*]:0:3}
a b c
[root@aliyun shuzu]# echo ${array[*]:0:2}
a b

#替换数组元素
[root@aliyun shuzu]# array=(1 2 3 4 1 1) 
[root@aliyun shuzu]# echo ${array[*]/1/a}
a 2 3 4 a a
[root@aliyun shuzu]# echo ${array[@]/1/a}
a 2 3 4 a a




三:Shell数组脚本开发实践

范例1):通过C语言型的for循环语句打印数组元素

法1:通过C语言型的for循环语句打印数组元素

[root@aliyun shuzu]# cat sz1.sh
#!/bin/bash
array=(a b c d e)
for((i=0;i<${#array[*]};i++))        #从数组的第一个下标0开始,循环数组的所有下标
do
    echo  ${array[i]}                #打印数组
done


法2:通过普通for循环语句打印数组元素

[root@aliyun shuzu]# cat sz2.sh
#!/bin/bash
array=(a b c d e)
for n in ${array[*]}
do
    echo $n
done


法3:使用while循环语句打印数组元素

[root@aliyun shuzu]# cat sz3.sh
#!/bin/bash
array=(a b c d e)
i=0
while ((i<${#array[*]}))
do
    echo ${array[i]}
    ((i++))
done


范例2):通过竖向列举法定义数组元素并批量打印

[root@aliyun shuzu]# cat sz4.sh
#!/bin/bash
array=(
ywxi
ywxi02
ming
ling
ywxluo
)
for((i=0;i<${#array[*]};i++))
do
    echo "This is num $i,then content is ${array[$i]}"
done
echo " "
echo "array length:${#array[*]}"  

脚本结果如下:
[root@aliyun shuzu]# sh sz4.sh
This is num 0,then content is ywxi
This is num 1,then content is ywxi02
This is num 2,then content is ming
This is num 3,then content is ling
This is num 4,then content is ywxluo
 
array length:5


范例3:将命令结果作为数组元素定义并打印

[root@aliyun shuzu]# mkdir array
[root@aliyun shuzu]# touch array/{1..3}.txt
[root@aliyun shuzu]# ls array/
1.txt  2.txt  3.txt
脚本如下:
[root@aliyun shuzu]# cat ls.sh 
#!/bin/bash
dir=($(ls /scripts/practice/shuzu/array))
for((i=0;i<${#dir[*]};i++))
do
    echo "This is NO.$i,filename is ${dir[$i]}"
done
[root@aliyun shuzu]# sh ls.sh 
This is NO.0,filename is 1.txt
This is NO.1,filename is 2.txt
This is NO.2,filename is 3.txt




四:shell数组的重要命令

1)定义命令

静态数组:

array=(1 2 3)

动态数组:

array=($(ls))

为数组赋值:

array[3]=4


2)打印命令

打印所有元素:

${array[@]}  或  ${array[*]}

打印数组长度:

${#array[*]} 或 ${array[@]}

打印单个元素:

${array[i]}   #i为数组下标



3)循环打印的常用基本语法

[root@aliyun shuzu]# cat xh.sh 
#!/bin/bash
array=(
192.168.1.1
192.168.1.2
192.168.1.3
)
#c语言for循环语法
for((i=0;i<${#array[*]};i++))
do
    echo ${array[i]}
done

#普通for循环语法
for n in ${array[*]}
do
    echo $n
done

 



五:Shell数组相关面试题实战  

范例:利用bash for循环打印下面这句话中字母数不大于6的单次(某企业面试真题)

We are the operation and maintenance engineers, the responsibility is to ensure data security


解题思路如下:

1)先把所有的单次放到数组里,然后依次进行判断。命令如下:

[root@aliyun shuzu]# array=(We are the operation and maintenance engineers, the responsibility is to ensure data security)


2)计算变量内容的长度的常见方法

[root@aliyun shuzu]# char=ywxi
[root@aliyun shuzu]# echo $char|wc -L
4
[root@aliyun shuzu]# echo ${#char}
4
[root@aliyun shuzu]# expr  length $char
4
[root@aliyun shuzu]# echo $char|awk '{print length($0)}'
4


3)脚本实现

法1:通过数组方法实现

[root@aliyun shuzu]# cat arr.sh 
#!/bin/bash
arr=(We are the operation and maintenance engineers, the responsibility is to ensure data security)
for((i=0;i<${#arr[*]};i++))
do
    if [ ${#arr[$i]} -lt 6 ]
    then
        echo "${arr[$i]}"
    fi
done

echo ---------------

for word in ${arr[*]}
do
    if [ ${#word} -lt 6 ]
    then
        echo "${word}"
    fi
done


法2:通过awk循环实现

[root@aliyun shuzu]# arr='We are the operation and maintenance engineers, the responsibility is to ensure data security' 
[root@aliyun shuzu]# echo $arr|awk '{for(i=1;i<=NF;i++) if(length($i)<=6) print $i}'
We
are
the
and
the
is
to
ensure
data