• 数组


    shell数组
    基础

    bash提供一维数组,在数组元素的最大数目上并无约束,甚至,不要求数组元素被连续赋值,其下标从0开始。


    创建与赋值

    一个数组可以通过如下方式复制而自动创建

    name[subscript]=value

    其中下标subscript必须为整数,大于或等于0。

    也可以显式的声明如下:

    declare -a name 
    # 或者 
    declare -a name[subscript] 
    # shell解释时会忽略subscript

    用如下方式可对整个数组赋值

    name=(var1 var2 … varn)

    也可以在赋值创建时候就指定对哪个元素赋值

    name=([0]=1 [2]=34 [3]=45)

    这样,在赋值的时候跳过对下标1的赋值,则变为空

    $ echo ${name[0]} 

    $ echo ${name[1]} 
     
    $ echo ${name[2]} 
    34

    数组元素可以是字符串,元素间以环境变量IFS分隔

    $ name=(hello glad to see you) 
    $ echo ${name[0]} 
    hello

    若要跨过分隔约束,可以用引号括起,单引号双引号都可以

    $ name=(hello “glad to” see you) 
    $ echo ${name[1]} 
    glad to

    数组引用

    在引用数组变量时,用 ${name[subscript]},必须要加上{ },否则shell无法解释。

    若下标为@或*,则作为通配符解释,代指所有的数组元素,但不可对这个两个作为下标赋值。

    $ echo ${name[@]}
     1 34 45 
    $ echo ${name[*]} 
    1 34 45 
    $ name[*]=23 
    -bash: name[*]: bad array subscript

    数组元素个数以${#name[@]}或者${#name[*]}获得。

    $ name=(1 2 3 4)
    $ echo ${#name[@]} 

    $ echo ${#name[*]} 
    4

    无下标的数组引用等价于引用其第0个元素

    $ name=(2 3 4) 
    $ echo ${name} 
    2

    销毁

    用unset命令可以销毁一个数组,也可以销毁一个元素

    # 销毁整个数组 
    unset name 
    unset name[*] 
    # 销毁一个元素 
    unset name[subscript]

    扩展-漂移

    获取数组某个元素的长度,比如下面例子,world长度为5

    $ name=(hello world) 
    $ echo ${name[1]} 
    world 
    $ echo ${#name[1]} 
    5

    数组元素漂移位置

    $ echo ${name[1]:0} # 漂移量为0 
    world 
    $ echo ${name[1]:1} # 漂移量为1 
    orld 
    $ echo ${name[1]:3} # 漂移量为3 
    ld 
    $ echo ${name[1]:6} # 超过元素长度,显示空行

    数组整体漂移位置

    $ array=(one two three four five) 
    $ echo ${array[@]:0} 
    one two three four five 
    $ echo ${array[@]:1} # 漂移量为1 
    two three four five 
    $ echo ${array[@]:1:2} # 量1,取2个 
    two three

    扩展-匹配移除

    数组元素匹配移除(以元素为单位,针对所有元素)
    # 从左向右进行最短匹配
    ## 从左向右进行最长匹配
    % 从右向左进行最短匹配
    %% 从右向左进行最长匹配

    $ echo ${array[@]#t*e} # thre匹配移除 
    one two e four five 
    $ echo ${array[@]##t*e} # three匹配移除 
    one two four five 
    $ echo ${array[@]%r*e} # ree匹配移除 
    one two th four five 
    $ echo ${array[@]%%r*e} # ree匹配移除 
    one two th four five

    扩展-替换

    /xx/yy 对每个元素只替换一次
    //xx/yy 对每个元素替换多次
    //x/ 删除匹配内容

    $ echo ${array[@]/e/E} # three第二个e没替换 
    onE two thrEe four fivE 
    $ echo ${array[@]//e/E} # three第二个e没替换 
    onE two thrEE four fivE 
    $ echo ${array[@]//e/} # 最大匹配删除 
    on two thr four fiv 
    $ echo ${array[@]/e/} # 最小匹配删除 
    on two thre four fiv

    /#xx/yy front-end匹配(从左向右)
    /%xx/yy back-end匹配(从右向左)

    $ echo ${array[@]/#o/O} # two的o没替换 
    One two three four five 
    $ echo ${array[@]/%o/O} # one的o没替换 
    one twO three four five

    用函数替换

    $ newstr() { 
    > echo -n “!!!” 
    > } 
    $ echo ${array[@]/%e/$(newstr)} 
    onXX two threXX four fivXX

    扩展-添加元素
    $ array=( “${array[@]}” “new1” ) 
    $ echo ${array[@]} 
    one two three four five new1 
    $ array[${#array[@]}]=”new2” 
    $ echo ${array[@]} 
    one two three four five new1 new2

    其他

    read命令支持以-a参数从标准输入读入一个数组

    $ read -a name 
    11 22 33 
    $ echo ${name[1]} 
    22
  • 相关阅读:
    047.Python前端html
    Python利用PyExecJS库执行JS函数-实战破解字段加密
    Frida用法之函数操作
    Frida的安装步骤基于Android系统组合Python语言
    利用Python多线程来测试并发漏洞
    微信公众号:Mysticbinary
    Windows系统下解决PhPStudy MySQL启动失败
    crontab 定时任务没有响应 检测步骤
    解决Android killer APK 编译失败,无法继续下一步签名
    Python操作MySQL的一些坑
  • 原文地址:https://www.cnblogs.com/zhaozhenguo666/p/5512791.html
Copyright © 2020-2023  润新知