博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
轻松掌握shell编程中数组的常见用法及示例
阅读量:6368 次
发布时间:2019-06-23

本文共 3433 字,大约阅读时间需要 11 分钟。

缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助。其实SHELL的数组很简单,好用。我们学习都应该遵循简单、易用的原则。

shell编程中数组的简单用法及示例

    新版本的Bash支持一维数组. 数组元素可以使用符号variable[xx]等方式来初始化. 另外, 脚本可以使用declare -a variable语句来指定一个数组等。要引用一个数组元素(也就是取值), 可以使用大括号, 访问形式为${variable[xx]},当然了,下面是一些老男孩经常使用的方法和对数组的一点理解,如有高见,欢迎指导,先谢谢博友们了。

1.1 shell数组的常用定义方法:

1)方法一:
命令法:
dir=($(ls .))

范例1:手工命令行操作演示

[root@oldboy scripts]# dir=($(ls .))
[root@oldboy scripts]# ls .
oldboy.log  apachemon.sh  httpdctl

[root@oldboy scripts]# echo ${#dir[*]} <==查看数组的长度

3

命令行循环打印数组元素:

写法1:
for ((i=0; i<`echo ${#dir[*]}`; i++))
do
echo -e "${dir[$i]}\n"
done
提示:i<`echo ${#dir[*]}`可以用更简单的写法i<${#dir[*]}替换,(感谢永夜兄弟)。
====================================
写法2:
for ((i=0; i<${#dir[*]}; i++))
do
echo -e "${dir[$i]}\n"
done
====================================
写法3:
for((i=0;i<${#dir[@]};i++))
do
echo ${dir[${i}]}
done

范例2:通过脚本定义及输出数组元素:

[root@oldboy scripts]# cat printarray.sh
dir=($(ls .))
for ((i=0; i<${#dir[*]}; i++))
do
   echo -e "${dir[$i]}\n"
done
[root@oldboy scripts]# sh printarray.sh 
oldboy.log

apachemon.sh

httpdctl

printarray.sh

====================================================
2)方法二:列举元素法
array=(red green blue yellow magenta)
array=(
 oldboy
 zhangyue
 zhangyang
)
范例3:列举元素法的脚本例子
[root@oldboy ~# cat test.sh
array=(
oldboy
zhangyue
zhangyang
)

for ((i=0; i< ${#array[*]}; i++))

do
   echo "${array[$i]}"
done
echo ----------------------
echo "array len:${#array[*]}"
[root@oldboy ~# sh test.sh
oldboy
zhangyue
zhangyang
array len:3

3)方法3:其实方法三和方法一一样,因具有很好的实战价值因此单独列出讲解

judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))

范例4:比较专业的生产检查URL地址的脚本(shell数组方法):

[root@oldboy ~]# cat check_url.sh
#!/bin/bash
# this script is created by oldboy.
# e_mail:31333741@qq.com
# qqinfo:49000448
# function:check web url
# version:1.1
. /etc/init.d/functions

url_list=(

)

function wait()

{
echo -n '3秒后,执行该操作.';
for ((i=0;i<3;i++))
do
  echo -n ".";sleep 1
done
echo
}
function check_url()
{
wait
echo 'check url...'
for ((i=0; i<${#url_list[*]}; i++))
do
# HTTP/1.1 200 OK
judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK' ]]
   then
   action "${url_list[$i]}" /bin/true
else
   action "${url_list[$i]}" /bin/false
fi
done
}
check_url
[root@oldboy ~]# sh check_url.sh 
3秒后,执行该操作....
check url...
[  OK  ]
[  OK  ]
[  OK  ]
提示:上述结果是带颜色的。

范例5:实现lvs负载均衡健康检查及自动剔除和自动加入RS的脚本(多年前的脚本)
[root@oldboy sbin]# cat health_check_url.sh     
#!/bin/bash
# this script is created by oldboy.
# e_mail:31333741@qq.com
# qqinfo:31333741
# function:
# version:1.1
PORT="80"
VIP=192.168.1.181
RIP=(
    192.168.1.178
    192.168.1.179
)
function check_url()
{
for ((i=0; i< ${#RIP[*]}; i++))
do
judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK' ]]
   then
     if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ]
      then
      ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
 
else
      if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ]
      then
      ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
      fi
fi
done
}
 
while true
do
 check_url
 sleep 5
done

---------------------------------------------------------

1.2 阅读博文后可以练习的小例子
问题1: 把1-3 3个数字存到数组里 分别乘以8 然后依次输出。
解答:
下面的评论里已有正确答案,有兴趣的朋友可以先思考写写,然后看评论,如果有问题欢迎评论提问,如果力所能及老男孩愿意为你解答疑惑。
问题2:一个SHELL脚本:oldboy.sh内容为定义一个数组array=(1 2 3)
要打印数组元素的个数。
要求:要把数组array当作变量在执行脚本时传参到脚本里使用(这块是本题的难点)
例如:这样执行 sh oldboy.sh array
解答:
下面的评论里已有正确答案,有兴趣的朋友可以先思考写写,然后看评论,如果有问题欢迎评论提问,如果力所能及老男孩愿意为你解答疑惑。

更多数组的知识,大家可以参考:

转载地址:http://lzema.baihongyu.com/

你可能感兴趣的文章
破坏程序员生产力的 12 件事
查看>>
什么是SOLID原则(第1部分)
查看>>
动态规划 python 挖矿问题
查看>>
Angular material中自定义分页信息
查看>>
iOS马甲包过审技巧汇总
查看>>
HTTP--http之Nginx缓存(九)
查看>>
通过几个栗子认识 PHP 闭包
查看>>
eclipse编译项目的时候报某类找不到符号
查看>>
React16.3.0以后的生命周期(二) - 更新、卸载、异常
查看>>
正确判断js数据类型 总结记录
查看>>
浅析微信支付:前篇大纲
查看>>
PHP To Go 转型手记 (终)
查看>>
深入研究Java String
查看>>
JAVA设计模式-策略模式
查看>>
开发5分钟,调试2小时 - 该如何debug?
查看>>
vuejs2.0 vsCode router前后端分离权限 vueAdmin后台基础模板
查看>>
基于 React Redux 的错误处理
查看>>
python基础知识之函数初阶——参数详解
查看>>
centos7 安装指定版本的docker
查看>>
Python 从零开始爬虫(九)——模拟登录,cookie的使用
查看>>