定义数组,语法规则如下:
# 注意shell语法,变量名和等号之间不能有空格
array=(arg1 arg2 arg3 ....)
获取数组长度
# 两种方法均可
${#array[@]}
${#array[*]}
for循环遍历
# 方法一
# 直接用循环变量 i 遍历获取数组中的元素
for i in ${array[@]}
do
num=$i
# do something....
done
# 方法二
# 先用seq语句获取数组大小范围,然后再使用循环变量 i 作为下标去访问数组元素
for i in $(seq 0 ${#array[@]})
do
num=${array[$i]}
# do something....
done
举个例子
array=('test1' 'test2' 'test3' 'test4' 'test5')
cd /testsoftware
for i in ${array[@]}
do
item=$i
dockerID = 'docker ps|grep ${item}'
if [ $dockerID = "" | $dockerID ==null ] ; then
echo "容器不在运行,直接开启"
docker-compose up -d ${FILENAME}
else
echo "容器在运行,进行重启"
docker-compose restart ${FILENAME}
fi
done
方法二需要注意的是,for i in {#array[@]}) 这条语句中的 seq 获取的范围是大于等于 0 小于等于
数组size的范围,这样你在遍历中就会遍历到数组最后一个元素的下一个元素。然而shell并不会报错,而是以空字符
来处理最后越界的那个元素
如下所示的例子(代码及输出样例)展示了方法二中问题的解决办法,用一个变量NUM先获取数组的大小,然后将其减 一,之后在seq语句中用此变量获取循环范围
下面的例子如果不增加 NUM 变量,直接按照方法二中的方式处理,则输出结果会多一个空行(最后一个字符数组中没有,用空串替代,因此会多输出一个空行)
#!/bin/bash
ARRAY=(60020 60021 60022)
# Get size of the array
# From 0 to (sizeof(array) - 1)
# So NUM = NUM - 1
NUM=${#ARRAY[@]}
NUM=`expr $NUM - 1`
for i in $(seq 0 $NUM)
do
temp=${ARRAY[$i]}
echo $temp
done
网友的例子
#!/bin/bash
# Login Infomation
HOSTNAME="6.6.6.6"
PORT="36000"
USERNAME="shelton"
PASSWORD="123456"
DBNAME="cosdb"
# Garden_id Array
GARDENID_SET=(60020 60021 60022 60065 6002091 60028 60852 64969 \
61416 60010 69041 60282 60191 6000101 60202 60666 \
60707 60181 75725 76886 79755 7999211 70010 80121)
#
# for循环
#
for i in ${GARDENID_SET[@]}
do
GARDENID=$i
# Select Command
cmd="select xx_1, xx2 from cos_xx_db where version=x and gardenid=${GARDENID} \
and appid=xxa and storage<10240 and date>=1589904000 and date<=1589990399"
# Output Path
DIR="/usr/sheltonzhao/${GARDENID}"
# TODO
# Genarate Target File (xx.txt)
mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -sNe "${cmd}" > ${DIR}.txt
done