一、背景
实习过程中,今天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 版权协议,转载请附上原文出处链接和本声明。