【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)

  • Post author:
  • Post category:linux


一、背景

实习过程中,今天mentor突然让我拉取一下远端园区数据库中的部分信息,因为包含很多不同园区的数据信息,而且要以园区为单位生成文件来对数据进行存放,因此自然是需要使用shell脚本来自动生成文件。

起初我写了一个一次生成一个文件的脚本,但是因为园区数量众多,生成一个数据文件就去修改脚本中的园区ID变量显然过于复杂,于是乎想到了能不能在shell脚本中创建一个园区ID的数组 + 使用循环遍历数组元素,只需填写一次数组就能通过循环自动将所有的文件拉取并生成出来。

本来在C/C++、Python、Java这些编程语言中数组 + 循环遍历是一件再简单不过的事情,但是奈何自己之前对shell脚本使用的并不是很多,因此只能现场学习,好在最后成功解决了问题,在此进行一下记录分享。

二、Shell脚本中数组的定义 + 循环获取数组元素



  • 定义数组


    ,语法规则如下:
# 注意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



方法二需要注意的是





for i in $(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

三、包含MySQL访问语句的完整脚本

# MySQL Login Command
mysql -h主机地址 -P端口 -u用户名 -p用户密码
#!/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



版权声明:本文为qq_34018840原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。