设为首页 收藏本站
查看: 921|回复: 0

Linux Shell编程之四数组

[复制链接]
YunVN网友  发表于 2018-8-30 06:47:09 |阅读模式
  shell编程之数组
  什么是数组呢?
  在编程语言中,数组是具有相同数据类型变量的集合,在内存中存储在一段连续的空间里。在 Linux shell 中数组也是这么定义,但用法和使用格式具有自己的特点。
  下面从不同角度来解析数组。
  一、数组的表示
  索引表示,一般使用数字做下标,从 0 开始:
  例如:a[0],a[1],a[2]
  关联数组,数组的下标可以使用任意字符(符合变量命名的规则):
  例如:a[/bin/bash],a[192.168.0.1]
  在 shell 中只支持一维数组,支持稀疏格式。
  二、数组的定义
  declaer -a sum
  read -p "please input a array:"-a sum
  declare -A sum  # 定义关联数组,如果使用关联数组必须先定义
  三、数组赋值
  一次只对一个赋值
  a[0]=1,a[2]=$RANDOM
  一次对全部元素赋值,例如:
  a=(red yellow black tigger mouse)
  按索引进行赋值
  a=([1]=less [9]=more [10]=cat [8]=tail) # 稀疏格式存储
  四、数组访问
  用索引访问,例如:
  a[0] a[more]
  引用数组的值
  ${a[0]},${a[more]}
  全部引用:
  ${a[@]},${a
  • } 一般情况下使用 ${a[@]} 这种形式,具体使用格式区别如下:
    [root@server array]# cat test\@.sh  
    #!/bin/bash
      
    for ((i=0;i < 5;i++));do
      
        a[$i]=$RANDOM
      
    done
      
    for loop in "${a[@]}";do
      
        echo $loop
      
    done
      
    for loop in "${a
  • }";do
      
        echo $loop
      
    done
      

      
    # ${a[@]} 这种形式列出所有的参数,每个参数是一个独立的字符串
      
    # ${a
  • } 也是列出所有的参数,单数所有的参数是一个字符串
      
    # 执行结果如下:
      
    [root@server array]# ./test\@.sh
      
    32181
      
    30658
      
    26576
      
    16071
      
    6521
      
    32181 30658 26576 16071 6521
      五、数组的长度
      ${#a
  • },${#a[@]} 都可以表示数组的长度,在遍历数组时会使用到。
    [root@server array]# a=(1 2 more less tail head)  
    [root@server array]# echo ${#a[@]}
      
    6
      
    [root@server array]# echo ${#a
  • }
      
    6
      6、从数组中挑选某元素:
      ${ARRAY[@]:offset:number}
      offset: 偏移的元素个数
      number: 取出的元素的个数
    [root@server array]# a=(1 2 more less tail head)  
    [root@server array]# echo ${a[@]:1:2}
      
    2 more
      ${ARRAY[@]:offset}:取出偏移量后的所有元素
    [root@server array]# echo ${a[@]:2}  
    more less tail head
      ${ARRAY[@]}: 取出所有元素
    [root@server array]# echo ${a[@]}  
    1 2 more less tail head
      七、向数组追加元素和从数组中删除元素
      这里一般针对的是非关联数组,也就是使用数字作为下标的数组
      追加元素:
    # 新追加的元素的下标是数组的长度  
    [root@server array]# a=(1 2 more less tail head)
      
    [root@server array]# a[${#a[@]}]=33
      
    [root@server array]# echo ${a[@]}
      
    1 2 more less tail head 33
      删除数组中的元素,使用unset ARRAY[index]
    [root@server array]# unset a[2]  
    [root@server array]# echo ${a[@]}
      
    1 2 less tail head 33
      八、数组的一些应用
      1、复制一个数组中下标为偶数的元素至一个新数组中
    #!/bin/bash  
    declare -a mylogs
      
    logs=(/var/log/*.log)
      

      
    echo ${logs[@]}
      

      
    for i in `seq 0 ${#logs[@]}`; do
      
        if [ $[$i%2] -eq 0 ];then
      
            index=${#mylogs[@]}
      
            mylogs[$index]=${logs[$i]}
      
        fi
      
    done
      

      
    echo ${mylogs[@]}
      

      
    # 这里最关键的是这一句 index=${#mylogs[@]}
      
    # 实现了新数组的下标的设定
      2、统计 /etc/passwd 中使用各个shell的次数
    #!/bin/bash  

      
    declare -A sum
      

      
    while read line ;do
      
        index=`echo $line | cut -d: -f7`
      
        let sum[$index]++
      
    done < /etc/passwd
      

      
    index_set=`cut -d: -f7 /etc/passwd | sort | uniq`
      

      
    for loop in $index_set;do
      
        echo "$loop in /etc/passwd total have ${sum[$loop]} times."
      
    done
      

      
    # 这里主要是考察关联数组的应用。真正在实际中这种用法较多。
      执行结果如下:
    [root@server array]# ./sumbash.sh  
    /bin/bash in /etc/passwd total have 56 times.
      
    /bin/sync in /etc/passwd total have 1 times.
      
    /bin/tcsh in /etc/passwd total have 1 times.
      
    /sbin/halt in /etc/passwd total have 1 times.
      
    /sbin/nologin in /etc/passwd total have 33 times.
      
    /sbin/shutdown in /etc/passwd total have 1 times.
      2、将 10 个随机数按升序排列
    #!/bin/bash  

      
    for i in {0..9};do
      
        arr[$i]=$RANDOM
      
    done
      

      
    echo "${arr[@]}"
      

      
    let -i tmp
      

      
    for i in `seq 0 $[${#arr[@]}-1]`;do
      
        for j in `seq $[$i+1] $[${#arr[@]}-1]` ;do
      
            if [  ${arr[$j]} -lt ${arr[$i]} ];then
      
                tmp=${arr[$j]}
      
                arr[$j]=${arr[$i]}
      
                arr[$i]=$tmp
      
            fi
      
        done
      
    done
      

      
    echo "${arr[@]}"
      

      
    # 这个示例只在说明数组的使用形式,shell 中的数组一般不进行这样的工作。
      执行结果:
    [root@server array]# ./sort.sh  
    749 18853 896 20690 4794 395 23231 24049 4906 21630
      
    395 749 896 4794 4906 18853 20690 21630 23231 24049
      至此,数组的基本使用就介绍完毕。



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558586-1-1.html 上篇帖子: expect登陆远程shell 下篇帖子: Linux Shell编程之五字符串的处理
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表