本文主要讲解 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
来源: http://www.bubuko.com/infodetail-2637117.html