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

【shell基础】11、数组初步及字符串处理

[复制链接]

尚未签到

发表于 2018-8-27 08:10:10 | 显示全部楼层 |阅读模式
  一、数组
  数组:是一种数据结构,
  数据序列,连续的多个数据,可以使用索引获取相关元素
  声明数组:
  declare -a ARRAYNAME  # 可以不事先声明
  初始化赋值:
  ARRAYNAME=(“STRING1” "STRING2"...)   #使用空格隔开
  ARRAYNAME=("STRING1" [4]="STRING2"...)
  ARRAYNAME[0]="STRING1" ARRYNAME[3]="STRING3"
  获取数组中所有元素:${ARRARYNAME[@],${ARRAYNAME
  • }
      获取数组中有效元素的总个数:${#ARRAYNAME[@]}${#ARRAYNAME
  • }
      获取某一元素中字符串的长度:${#ARRAYNAME[INDEX]} (INDEX=0,1,2,3...)
      例:
    [root@xxj shell]# echo ${color[0]}  
    red
      
    [root@xxj shell]# echo ${color[1]}
      
    bule
      
    [root@xxj shell]# echo ${color[2]}
      
    gree
      
    [root@xxj shell]# echo $color[2]
      
    red[2]
      
    [root@xxj shell]# echo $color         #数组不指定引用其第几个元素默认是引用第一个元素
      
    red
      
    [root@xxj ~]# x=(nihao "s b" [4]='ruozhi')
      
    [root@xxj ~]# echo ${x[5]}
      

      
    [root@xxj ~]# echo ${x[2]}
      

      
    [root@xxj ~]# echo ${x[1]}
      
    s b
      
    [root@xxj ~]# echo ${x[4]}
      
    ruozhi
      
    [root@xxj ~]# x=(333 22 4444 555555555)
      
    [root@xxj ~]# echo ${#x[1]}
      
    2
      
    [root@xxj ~]# echo ${#x[3]}
      
    9
      传统数组和关联数组
      数组索引为数字的是传统数组
      数组索引为字符串的是关联数组
      在bash中传统数组可以不事先定义# declare -a,而关联数组必须事先定义# declare -A,awk中都可以不事先定义
    # 传统数组  
    [root@Node5 ~]# Test=([0]=a [2]=c)
      
    [root@Node5 ~]# echo $Test
      
    a
      
    [root@Node5 ~]# echo $Test[2]
      
    a[2]
      
    [root@Node5 ~]# echo ${Test[2]}
      
    c
      

      
    # 关联数组
      
    [root@Node5 ~]# Test1=([a]=AA [c]=CC)
      
    [root@Node5 ~]# echo $Test1
      
    CC
      
    [root@Node5 ~]# echo $Test1[0]
      
    CC[0]
      
    [root@Node5 ~]# echo ${Test1[0]}
      
    CC
      
    [root@Node5 ~]# echo ${Test1[a]}
      
    CC
      

      
    [root@Node5 ~]# declare -A Test2=([a]=AA [c]=CC)
      

      
    [root@Node5 ~]# echo ${Test2[a]}
      
    AA
      
    [root@Node5 ~]# echo ${Test2[0]}
      

      
    [root@Node5 ~]# echo ${Test2[c]}
      
    CC
      
    [root@Node5 ~]#
      二、bash伪随机数生成器
      $RANDOM
    [root@Note3 ~]# echo $RANDOM  
    4852
      
    [root@Note3 ~]# echo $RANDOM
      
    3161
      
    [root@Note3 ~]# echo $RANDOM
      
    23935
      
    [root@Note3 ~]# echo $[RANDOM%40]
      
    26
      
    [root@Note3 ~]# echo $[RANDOM%40]
      
    21
      
    [root@Note3 ~]# echo $[RANDOM%40]
      
    16
      练习:
      1、打印九九乘法表
    [root@xxj shell]# cat 12.sh  
    #!/bin/bash
      
    n=('1' '2' '3' '4' '5' '6' '7' '8' '9')
      
    for x in $(seq 0 8);do
      
        for y in $(seq 0 $x);do
      
            echo -e -n "${n[y]}x${n[x]}=$[${n[x]}*${n[y]}]\t"
      
            done
      
       echo
      
    done
      

      
    [root@xxj shell]# bash 12.sh
      
    1x1=1
      
    1x2=2   2x2=4
      
    1x3=3   2x3=6   3x3=9
      
    1x4=4   2x4=8   3x4=12  4x4=16
      
    1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
      
    1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
      
    1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
      
    1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
      
    1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81
      2、通过脚本生成N个随机数(N>5),对这些随机数按从小到大排序(冒泡排序)
      3、从所有同学们中挑选随机任意位
      三、字符串处理
      1、字符串切片
      ${#var}
      返回字符串变量var的长度
      ${var:offset}
      从最左侧跳过offset字符,返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值0 到${#var}-1 之间
      ${var: -offset}:
      取字符串的最右侧几个字符,使用空格或括号
      相当于自左而有跳过${#var} - n 个字符,返回后面的字符串
    [root@Node1 ~]# name="xie xiao jun"  
    [root@Node1 ~]# echo ${#name}
      
    12
      
    [root@Node1 ~]# echo ${name:4}
      
    xiao jun
      
    [root@Node1 ~]# echo ${name:-4}
      
    xie xiao jun
      
    [root@Node1 ~]# echo ${name:(-4)}
      
    jun
      
    [root@Node1 ~]# echo ${name: -5}
      
    o jun
      ${var:offset:number}:
      返回字符串变量var 中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
      ${var: -offset:number}:
      返回字符串变量var 中从第${#var}-offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
      ${var:offset: -number}:
      从最左侧跳过offset 字符,一直取到字符串的最右侧number个字符之前(抛头去尾取中间)(bash4.2后才支持)
    截取hello字符串:  
    # VAR='hello world!'
      
    # echo ${VAR:0:5}
      
    hello
      
    截取world字符串:
      
    # echo ${VAR:5:-1}
      
    world
      
    截取最后一个字符:
      
    # echo ${VAR:(-1)}    #使用空格隔开也可以
      
    !
      ${#var}:
    [root@Note3 ~]# name="xie jun"  
    [root@Note3 ~]# arr1=(str1 str22 str333)
      
    [root@Note3 ~]# echo $name
      
    xie jun
      
    [root@Note3 ~]# echo $arr1
      
    str1
      
    [root@Note3 ~]# echo $#name
      
    0name
      
    [root@Note3 ~]# echo ${#name}
      
    7
      
    [root@Note3 ~]# echo ${#arr1}      #数组返回的是第一个元素的长度
      
    4
      ${var:offset}:
    [root@Note3 ~]# echo ${name:0}    #从0开始  
    xie jun
      
    [root@Note3 ~]# echo ${name:1}
      
    ie jun
      
    [root@Note3 ~]# echo ${name:5}   #空格也算一个字符
      
    un
      
    [root@Note3 ~]# echo ${name:-5}
      
    xie jun
      
    [root@Note3 ~]# echo ${name: -5}  #使用负值要使用空格,负值表示从右往左数
      
    e jun
      
    [root@Note3 ~]# echo ${arr1:1}
      
    tr1
      
    [root@Note3 ~]# echo ${arr1[1]:1}
      
    tr22
      ${var:offset:number}:
    [root@Note3 ~]# echo ${name:1:1}  
    i
      
    [root@Note3 ~]# echo ${name:3:3}
      
    ju
      
    [root@Note3 ~]# echo ${name:3:10}
      
    jun
      
    [root@Note3 ~]# echo ${name:10:10}
      

      
    [root@Note3 ~]# echo ${name:-1:10}    #没使用空格,无效
      
    xie jun
      
    [root@Note3 ~]# echo ${name: -1:10}
      
    n
      
    [root@Note3 ~]# echo ${name: -5:10}
      
    e jun
      
      2、字符串截取
      ${var#*word}:其中word可以是指定的任意字符
      功能:
      自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符
      ${var##*word}:同上,
      不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容(即贪婪模式的删除)
    [root@Node1 ~]# echo $name  
    xie xiao jun
      
    [root@Node1 ~]# echo ${name#s}
      
    xie xiao jun
      
    [root@Node1 ~]# echo ${name#*ia}
      
    o jun
      
    [root@Node1 ~]# echo ${name#*i}
      
    e xiao jun
      
    [root@Node1 ~]# echo ${name##*i}
      
    ao jun
      ${var%word*}:其中word可以是指定的任意字符;
      功能:
      自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
      ${var%%word*}:同上,
      只不过删除字符串最右侧的字符向左至最后一次出现word 字符之间的所有字符,(贪婪模式);
      注意:
      支持使用通配符,不支持正则表达式
    [root@Note3 ~]# str="i very very love linux "  
    [root@Note3 ~]# echo ${str#*e}
      
    ry very love linux
      
    [root@Note3 ~]# echo ${str##*e}
      
    linux
      

      
    [root@Note3 ~]# echo ${str%e*}
      
    i very very lov
      
    [root@Note3 ~]# echo ${str%%e*}
      
    i v
      
      3、字符串查找替换
      ${var/pattern/substi}:
      查找var所表示的字符串中,第一次被pattern 所匹配到的字符串,以substi替换之
      ${var//pattern/substi}:
      查找var所表示的字符串中,所有能被pattern 所匹配到的字符串,以substi 替换之(全局替换)
      ${var/#pattern/substi}
      查找var 所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之
      ${var/%pattern/substi}
      查找var 所表示的字符串中,行尾被pattern 所匹配到的字符串,以substi 替换之
      ${var/pattern[/]}:查找var 所表示的字符串中,删除第一次pattern 所匹配到的字符串
      注意:
      支持使用通配符,不支持正则表达式
    [root@Note3 ~]# echo ${str/e.y/sb}      #不支持正则表达式  
    i very very love linux
      
    [root@Note3 ~]# echo ${str/e?y/sb}      #支持通配符
      
    i vsb very love linux
      
    [root@Note3 ~]# echo ${str/e[a-z]y/sb}
      
    i vsb very love linux
      
    [root@Note3 ~]# echo ${str//e?y/sb}
      
    i vsb vsb love linux
      

      
    [root@Note3 ~]# echo ${str/#i/sb}
      
    sb very very love linux
      
    [root@Note3 ~]# echo ${str/%i/sb}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${str/%ux/sb}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${str/%u/sb}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${str/%x/sb}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${str/%?/sb}
      
    i very very love linuxsb
      

      
    #查找删除(替换为空)
      
    [root@Note3 ~]# str="i very very love linux"
      
    [root@Note3 ~]# echo ${str/%linux}
      
    i very very love
      
    [root@Note3 ~]# echo ${str/%linux/}
      
    i very very love
      
    [root@Note3 ~]# echo ${str/i/}
      
    very very love linux
      
    [root@Note3 ~]# echo ${str/i v/}
      
    ery very love linux
      
    [root@Note3 ~]# echo ${str/i v}
      
    ery very love linux
      
    [root@Note3 ~]# echo ${str/v}
      
    i ery very love linux
      
    [root@Note3 ~]# echo ${str//v}
      
    i ery ery loe linux
      
      4、字符大小写转换
      ${var^^}:把var 中的所有小写字母转换为大写
      ${var,,}:把var 中的所有大写字母转换为小写
    [root@Note3 ~]# echo ${str^^}  
    I VERY VERY LOVE LINUX
      
    [root@Note3 ~]# echo ${str,,}
      
    i very very love linux
      
      5、变量赋值
      ${var:-value}:如果var为空或未设置,那么返回value ;否则,返回var的值
      ${var:+value}:如果var不空,则返回value ,否则返回var的值即空值
      ${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则返回var的值
      ${var:?error_info}:如果var为空或未设置,那么在当前终端打印error_info;否则返回var的值
    [root@Note3 ~]# echo $str  
    i very very love linux
      
    [root@Note3 ~]# echo $xj
      

      
    [root@Note3 ~]# echo ${str:-xiejun}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${xj:-xiejun}
      
    xiejun
      
    [root@Note3 ~]# echo ${str:xiejun}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${str:+xiejun}
      
    xiejun
      
    [root@Note3 ~]# echo ${xj:xiejun}
      

      
    [root@Note3 ~]# echo ${xj:+xiejun}
      

      
    [root@Note3 ~]# echo ${str:=xiejun}
      
    i very very love linux
      
    [root@Note3 ~]# echo ${xj:=xiejun}
      
    xiejun
      
    [root@Note3 ~]# echo $xjj
      

      
    [root@Note3 ~]# echo ${xjj:?xiejun}
      
    -bash: xjj: xiejun
      
    [root@Note3 ~]# echo $xjj



  • 运维网声明 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.iyunv.com/thread-557023-1-1.html 上篇帖子: linux基础入门shell基础特性 下篇帖子: shell --条件判断
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

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

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

    扫描微信二维码查看详情

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


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


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


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



    合作伙伴: 青云cloud

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