【Linux】Shell脚本中如何使⽤“循环”遍历“数组”中的元素(包
括MySQL的常⽤指令介绍)
⼀、背景
实习过程中,今天mentor突然让我拉取⼀下远端园区数据库中的部分信息,因为包含很多不同园区的数据信息,⽽且要以园区为单位⽣成⽂件来对数据进⾏存放,因此⾃然是需要使⽤shell脚本来⾃动⽣成⽂件。
起初我写了⼀个⼀次⽣成⼀个⽂件的脚本,但是因为园区数量众多,⽣成⼀个数据⽂件就去修改脚本中的园区ID变量显然过于复杂,于是乎想到了能不能在shell脚本中创建⼀个园区ID的数组 + 使⽤循环遍历数组元素,只需填写⼀次数组就能通过循环⾃动将所有的⽂件拉取并⽣成出来。
本来在C/C++、Python、Java这些编程语⾔中数组 + 循环遍历是⼀件再简单不过的事情,但是奈何⾃⼰之前对shell脚本使⽤的并不是很多,因此只能现场学习,好在最后成功解决了问题,在此进⾏⼀下记录分享。
⼆、Shell脚本中数组的定义 + 循环获取数组元素
定义数组,语法规则如下:
# 注意shell语法,变量名和等号之间不能有空格
array=(arg1 arg2 arg3 ....)
获取数组长度
# 两种⽅法均可
${#array[@]}
${#array[*]}在linux中下载mysql时冲突是什么
for循环遍历
# ⽅法⼀
# 直接⽤循环变量 i 遍历获取数组中的元素
for i in ${array[@]}
do
num=$i
#
done
# ⽅法⼆
# 先⽤seq语句获取数组⼤⼩范围,然后再使⽤循环变量 i 作为下标去访问数组元素
for i in $(seq 0 ${#array[@]})
do
num=${array[$i]}
#
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:729038198,我们将在24小时内删除。