一、背景

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

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

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

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

  • 定义数组,语法规则如下:
# 注意shell语法,变量名和等号之间不能有空格
array=(arg1 arg2 arg3 ....)
  • 获取数组长度
# 两种方法均可
${#array[@]}
${#array[*]}
  • for循环遍历
# 方法一
# 直接用循环变量 i 遍历获取数组中的元素
for i in ${array[@]}
donum=$i# do something....
done# 方法二
# 先用seq语句获取数组大小范围,然后再使用循环变量 i 作为下标去访问数组元素
for i in $(seq 0 ${#array[@]})
donum=${array[$i]}# do something....
done

方法二需要注意的是for i in $(seq 0 ${#array[@]}) 这条语句中的 seq 获取的范围是大于等于 0 小于等于数组size的范围,这样你在遍历中就会遍历到数组最后一个元素的下一个元素。然而shell并不会报错,而是以空字符来处理最后越界的那个元素。

  • 如下所示的例子(代码及输出样例)展示了方法二中问题的解决办法,用一个变量NUM先获取数组的大小,然后将其减一,之后在seq语句中用此变量获取循环范围
  • 下面的例子如果不增加 NUM 变量,直接按照方法二中的方式处理,则输出结果会多一个空行(最后一个字符数组中没有,用空串替代,因此会多输出一个空行)
#!/bin/bashARRAY=(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

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

  1. Linux Shell脚本while和until循环

    Linux Shell脚本while和until循环 一.while循环 只要条件成立,则反复循环,不成立即停止 while 条件测试操作 do命令序列 done 例: 计算1到100所有整数和 二. ...

  2. JavaScript中利用for循环遍历数组

    这篇文章主要为大家详细介绍了JavaScript中利用for循环遍历数组,最好不要使用for in遍历,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先看一段代码 1 2 3 4 5 6 7 8 ...

  3. html页面遍历数组,JavaScript中利用for循环遍历数组

    先看一段代码 Document // 一个普通的数组 var arr =[3,5,2,6]; // 普通的for 循环遍历 for(var i = 0 ; i < arr.length; i++ ...

  4. python中字典的循环遍历_python中字典如何遍历循环

    python中字典如何遍历循环 发布时间:2020-09-24 14:16:07 来源:亿速云 阅读:64 作者:Leah 这篇文章将为大家详细讲解有关python中字典如何遍历循环,文章内容质量较高 ...

  5. Java中使用for循环删除数组中某个元素,并按原有顺序打印

    package com.ty.demo; //使用for循环删除数组中的某个元素,并按照原有顺序打印出来 public class Demo03 { public static void main(S ...

  6. linux脚本简介,Linux Shell脚本简介

    Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...

  7. linux怎么判断网络是否正常运行,Linux shell脚本判断服务器网络是否可以上网

    微信公众号:「小林coding」 用简洁的方式,分享编程小知识. Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需 ...

  8. JavaScript 循环遍历数组的11种方法

    本教程解释了如何在 JavaScript 中循环遍历数组.根据我们的用例和代码的速度/效率,我们可以使用 Vanilla JavaScript 中的传统方法(如for循环和while循环)或使用 ES ...

  9. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

最新文章

  1. Pytorch之GPU加速计算问题以及model=model.to(device)
  2. Unity 总裁 John Riccitiello 发话:VR足以匹敌互联网
  3. linux获得蓝牙外设mac,iOS获取蓝牙外设Mac地址
  4. 计算机导论的重点,计算机导论重点题目精华版
  5. 04_SSM整合ActiveMQ支持多种类型消息
  6. springboot starter工作原理_98,谈谈SpringBoot的工作原理
  7. VideoSolo Blu ray Player for Mac - 强大的蓝光播放器
  8. js模块化编程之彻底弄懂CommonJS和AMD/CMD
  9. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)
  10. Swift - 触摸事件响应机制(UiView事件传递)
  11. 教师计算机培训心得体会范文,教师计算机教育培训学习心得体会
  12. 软件工程小组第九次会议记录
  13. Kafka面试题总结
  14. MATLAB 图像识别
  15. 【绘画素材】日系插画“人物表情”素材参考!告别脸部僵硬~
  16. 小鸟飞行游戏【附源码】
  17. 奔驰S400商务型升级前排通风座椅系统,夏天必备的功能
  18. php pdf转txt文件,PDF文件在线转换TXT
  19. GBase 8a语法格式
  20. exec 和 exec_

热门文章

  1. rstudio找不到r低版本_R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配...
  2. 如何将visio画的图转为eps格式?
  3. ~ 如何用C++自制一个日麻游戏 ~(一)大体框架构建 § 2 数据结构
  4. [k8s集群系列-09]Kubernetes 组件 Dashboard
  5. php修改qq举报按钮,自定义修改QQ在线状态
  6. 【Pytorch深度学习50篇】·······第六篇:【常见损失函数篇】-----BCELoss及其变种
  7. 栈和堆的区别【总结】
  8. 程序员去外包的后遗症是什么
  9. 做抖音为什么需要海外抖音服务器?如何自建海外抖音服务器站点?
  10. C语言(字符串输入)