缘起:在老男孩进行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=(
http://etiantian.org
http://www.linuxpeixun.com
http://oldboy.blog.51cto.com
)

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...
http://etiantian.org [  OK  ]
http://www.linuxpeixun.com [  OK  ]
http://oldboy.blog.51cto.com [  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://www.etiantian.org/ebooks/cn_shell_abs/html/arrays.html

本文出自 “老男孩linux培训” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/1055734

(转)轻松掌握shell编程中数组的常见用法及示例的更多相关文章

  1. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  2. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  3. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  4. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  5. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  6. shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法

    shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...

  7. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  8. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

  9. shell编程中用户输入处理(shell 04)

    shell编程中用户输入处理1.命令行参数2.脚本运行时获取输入 命令行参数 通过空格来进行分割的位置参数 :$+position $0,$1,$2 ....$0 :程序名$1,$2,$3 ... $ ...

随机推荐

  1. 20169219《linux内核原理与分析》第九周作业

    网易云课堂学习 可执行程序的装载 可执行程序的产生过程:预处理-----> 编译 ----> 汇编 ----> 链接 以hello.c文件为例进行分析,编译步骤如下 vi hello ...

  2. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  3. [CentOS7] 安装sogou输入法

    CentOS7 下的默认输入法不是很好用,于是还是用sogou输入法 由于官网只有Ubuntu版本的sogou输入法安装包,于是先下载下来再说,博主用的版本在这里(密:ph13): 接下来解压data ...

  4. CSS3 -- FlexBox(弹性盒子)

    盒子模型 CSS中有一种基础设计模式叫盒模型,盒模型定义了Web页面中的元素如何来解析. 在盒模型中主要包括width.height.border.background.padding和margin这 ...

  5. 学习高性能mysql

    Mysql 的InnoDB存储引擎实现的不是简单的行级锁,实现的是MVCC,多版本并发控制,可以理解成行级锁的一个变种. InnoDB的MVCC是通过在每行纪录后面保存两个隐藏的列来实现的.这两个列, ...

  6. vue框架搭建的详细步骤(一)

    在这里我们先快速的搭建一个vue的脚手架: (1).在安装vue的环境之前,安装NodeJS环境是必须的.可以使用node -v指令检查,需要保证安装了4.0版本以上的nodeJS环境. 没有安装的话 ...

  7. ASP.NET-GridView之导出excel或word

    在CS阶段我们涉及到表格的导出,再Web开发同样可以实现,而且实现形式多种多样.以下面的例子说明表格导出到excel和word 这里用到了一个后台方法输出流形成***文件的的公共方法 DEMO < ...

  8. 洛谷P2606 [ZJOI2010]排列计数(数位dp)

    题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...

  9. 给花_Q

  10. 10.Find All Anagrams in a String(在一个字符串中发现所有的目标串排列)

    Level:   Easy 题目描述: Given a string s and a non-empty string p, find all the start indices of p's ana ...