Linux——在shell脚本中定义和使用数组
前言
我们在写shell脚本的时候,有时候会需要对多台服务器,或者相近的几个资源做同样的操作。一般情况下我们会考虑使用
for
循环来解决这些问题,而作为for循环的资源对象,我们一般会放在数组中进行操作。在本篇文章中,我们将对shell脚本中数组的定义和使用进行介绍。
一、数组的定义
数组的定义有三种方式
语法一:使用( )
进行包裹(常用)
arr=(aa bb cc)
语法二:使用()
+[]
进行定义(少用)
语法二的优点是可以顺便定义元素的位置,但写法相对比较繁琐一点。
arr=([0]=aa [1]=bb [2]=cc)
语法三:手动定义元素值
这种语法的优点是可以逐个定义元素的位置和内容
arr[0]=aa
arr[1]=bb
arr[2]=cc
语法四:引入外部的数据作为数组的内容
需要结合$()
命令来将命令执行结果作为数组的内容
arr=$(ls /tmp/)
二、数组的操作
(一)获取数组中的某个元素的值
语法:
${数组变量名[索引坐标]}
案例:
#!/bin/bash
echo "====================="
arr=(aa bb cc)
echo "${arr[1]}"
echo "====================="
结果如下:
[root@10-60-159-92 testssh]# sh test.sh
=====================
bb
=====================
(二)获取数组中所有元素
这个语法能够和for
循环配合,完成我们操作数组元素的操作。
语法:
${数组变量名[@]}
或者${数组变量名[*]}
案例:
[root@10-60-159-92 testssh]# cat test.sh
#!/bin/bash
echo "====================="
arr=(aa bb cc)
echo "${arr[*]}"
echo "${arr[@]}"
echo "====================="
[root@10-60-159-92 testssh]# sh test.sh
=====================
aa bb cc
aa bb cc
element is aa
element is bb
element is cc
=====================
(三)获取数组中的元素个数
语法:
${#数组变量名[@]}
或者${#数组变量名[*]}
案例:
#!/bin/bash
echo "====================="
arr=(aa bb cc)
echo "${#arr[*]}"
echo "${#arr[@]}"
echo "====================="
结果如下:
[root@10-60-159-92 testssh]# sh test.sh
=====================
3
3
=====================
(四)数组(元素)的删除
语法:unset 数组变量名 或者 unset 数组变量名[索引下标]
案例:
#!/bin/bash
echo "====================="
arr=(aa bb cc)
unset arr[1]
echo "${arr[@]}"
unset arr
echo "${arr[@]}"
echo "====================="
结果如下,可以看到原坐标索引为1的元素已经被删除了。
[root@10-60-159-92 testssh]# sh test.sh
=====================
aa cc
=====================
(五)数组元素的截取和替换
元素截取语法:
${数组变量名[@]:起始索引下标:结束索引下标}
元素替换语法:${数组变量名[@]/旧元素值/新元素值}
案例:
#!/bin/bash
echo "====================="
arr=(aa bb cc dd)
echo "${arr[@]:1:2}"
echo "${arr[@]/bb/pp}"
echo "${arr[@]}"
echo "====================="
执行结果如下,我们可以发现这两个命令并不会改变原有的数组,而是会生成新的数组
[root@10-60-159-92 testssh]# sh test.sh
=====================
bb cc
aa pp cc dd
aa bb cc dd
=====================
(六)遍历数组所有元素
遍历数组中的元素,一般我们会结合for
命令来实现。常见的实现方式有两种,for in
和for (( ))
方法一:for in
#!/bin/bash
echo "====================="
arr=(aa bb cc dd)
for var in ${arr[@]}
do
echo "element is $var"
done
echo "====================="
方法二:for (( ))
#!/bin/bash
echo "====================="
arr=(aa bb cc dd)
for ((i=0;i<${#arr[@]};i++))
do
echo "element is ${arr[i]}"
done
echo "====================="
PS:需要注意,上述的${#arr[@]}
换成${#arr[*]}
也是同样适用的~