• (转)轻松掌握shell编程中数组的常见用法及示例


    缘起:在老男孩进行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]} "
    done
    提示:i<`echo ${#dir[*]}`可以用更简单的写法i<${#dir[*]}替换,(感谢永夜兄弟)。
    ====================================
    写法2:
    for ((i=0; i<${#dir[*]}; i++))
    do
    echo -e "${dir[$i]} "
    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]} "
    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 " " " "))

    范例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 " " " "))
    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 " " " "))
    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

  • 相关阅读:
    使用bottle进行web开发(2):http request
    使用bottle进行web开发(1):hello world
    python modules
    python的class的__str__和__repr__(转)
    functools模块方法学习(1):partial
    bottle框架学习(2):变量定义等
    VisualSVN_Server安装_配置图文教程
    管理的艺术--达尔文进化论:适者生存 末位淘汰
    LINUX怎么修改IP地址
    Cent OS 命令行和窗口界面默认登录切换方法
  • 原文地址:https://www.cnblogs.com/liujiacai/p/7846848.html
Copyright © 2020-2023  润新知