每天一个知识点-shell脚本 循环写法

1,061 阅读1分钟

定义数组,语法规则如下:

# 注意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 (seq0(seq 0 {#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