zoukankan      html  css  js  c++  java
  • 5shell中的数组

    0.理解数组

    (1)shell不限制数组的大小,数组元素的下标从0开始计数

    (2)获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式,但是下标必须大于等于0

    (3)bash shell只支持一维数组,不支持多维数组

    1.数组的定义

    在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:

    array_name=(ele1  ele2  ele3 ... elen)

    注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

    情形
    脚本
    解释
    定义数组
    1. nums=(29 100 13 91 44)

    echo ${nums[*]}----->29 100 13 8 91 44

    Shell 是弱类型的,它并不要求所有数组元素的类型必须相同
    1. arr=(20 56 "http://c.biancheng.net/shell/")
    第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。
    Shell 数组的长度不是固定的,定义之后还可以增加元素
    1. nums=(29 100 13 91 44)
    2. nums[6]=88

    echo ${nums[*]}------>9 100 13 8 91 44 88

    无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:

    1. ages=([3]=24 [5]=19 [10]=12)

    以上代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。

    • echo ${ages[3]}------->24
    • echo ${ages[4]}------->空
    • echo ${ages[5]}-----→19
    • echo ${ages[11]}------>空

    注意到虽然数组长度是3,但是该数组只在指定位置有真实值,其他位置的值都为空,即使下标位置越界,其值依然为空,不会报错

    2.获取数组元素

    获取数组元素的值,一般使用下面的格式:${array_name[index]},其中,array_name 是数组名,index 是下标。

    情形
    脚本
    结果
    获取数组第二个元素 echo ${nums[2]}  
    使用@*可以获取数组中的所有元素

    echo ${nums[*]}

    echo ${nums[@]}

     
    举栗
    1. #!/bin/bash
    2. nums=(1 3 5 7)
    3. echo '输出所有数组元素:'${nums[*]}
    4. echo '输出第2个元素:'${nums[2]}
    5. nums[5]=8#给第5个元素赋值(此时会增加数组长度)
    6. echo '输出第3个元素:'${nums[3]}
    7. echo '输出第4个元素:'${nums[4]}
    8. echo '输出第5个元素:'${nums[5]}
    9. echo '输出所有数组元素:'${nums[@]}
    运行结果:

    输出所有数组元素:1 3 5 7

    输出第2个元素:5

    输出第3个元素:7

    输出第4个元素:

    输出第5个元素:8

    输出所有数组元素:1 3 5 7 8

    3.计算数组长度

    数组长度,即数组元素的个数,可以使用#来获取数组元素的个数。

    情形
    脚本
    结果
    使用#来获取数组元素的个数 ${#array_name[@]}
    ${#array_name[*]}
     
    获取指定下标位置的元素长度

    获取 arr 数组的第 2 个元素(假设它是字符串)的长度。

    ${#arr[2]} 

     
    字符串长度的获取方式 ${#string_name}  
    举栗
    1. #!/bin/bash
    2. nums=(1 3 5 7)

    3. echo '输出数组的长度:'${#nums[*]}

    4. var1='qwertyuiop'

    5. echo '字符串长度:'${#var1}

    6. nums[8]=${var1}

    7. echo '输出数组的长度:'${#nums[@]}

    8. echo '第1个元素的长度:'${#nums[1]}

    9. echo '第8个元素的长度:'${#nums[8]}

    10. unset nums[1]#删除元素

    11. echo '输出数组的长度:'${#nums[@]}

    运行结果:

    输出数组的长度:4

    字符串长度:10

    输出数组的长度:5

    第1个元素的长度:1

    第8个元素的长度:10

    输出数组的长度:4

    4.拼接数组

    所谓 Shell 数组拼接就是将两个数组连接成一个数组。
    拼接数组的思路是:先利用@*,将数组扩展成列表,然后再合并到一起。具体格式如下:

    array_new=(${array1[@]}  ${array2[@]})
    array_new=(${array1[*]}  ${array2[*]})

    举栗
    结果
    1. #!/bin/bash
    2. arr1=(1 2)
    3. arr2=(qwer tyui)
    4. array_new1=(${arr1[*]} ${arr2[@]})
    5. array_new2=(${arr1[@]} ${arr2[*]})
    6. echo ${array_new1[*]}
    7. echo ${array_new2[@]}
    运行结果:

    1 2 qwer tyui

    1 2 qwer tyui

    5.删除数组元素或数组

    情形
    脚本
    结果
    使用 unset 关键字来删除数组元素 unset array_name[index]  
    删除整个数组 unset array_name  
    举栗
    1. #!/bin/bash
    2. arr=(23 56 99 66 )
    3. unset arr[1]
    4. echo ${arr[@]}
    5. unset arr
    6. echo ${arr[*]}

    运行结果:

    23 99 66

     

    注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出为空

    6.关联数组

    shell中的关联数组类似于Python中字典的概念,关联数组也成为键值对数组,键(key)即数组的下标,值(value)即元素值。

    6.1 创建关联数组

    创建关联数组必须使用带有-A选项的 declare 命令

    情形
    脚本
    新定义后赋值
    1. declare -A people
    2. color['num1']=xiaohong
    3. color[num2]=xiaobai
    4. color["num3"]=xiaohei
    定义时同时赋值
    1. declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)

    6.2 访问关联数组元素

    情形
    脚本
    结果
    获取关联数组的元素值 $(array_name["index"])

    echo ${people[num1]}-----> xiaohong

    获取所有元素的下标 ${!array_name[@]}
    ${!array_name[*]}

    echo ${people[*]}----->xiaohong xiaobai xiaohei

    echo ${people[@]}----->xiaohong xiaobai xiaohei

    获取所有元素的值 ${array_name[@]}
    ${array_name[*]}

    echo ${!people[*]}-----> num1 num2 num3

    echo ${!people[@]}-----> num1 num2 num3

    获取关联数组长度

    与获取普通数组长度的方式相同

    ${#array_name[*]}
    ${#array_name[@]}

    echo ${#people[*]}-----> 3

    echo ${#people[@]}-----> 3

    举栗
    1. #!/bin/bash
    2. declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)
    3. echo '联合数组的key值为:'${!people[*]}
    4. echo '联合数组元素值为:'${people[*]}
    5. echo '联合数组的长度为:'${#people[@]}
    6. echo '循环打印联合数组的key值'
    7. for item in ${!people[@]}
    8. do
    9. echo ${item}
    10. done
    11.  
    12. echo '循环打印联合数组的元素值'
    13. for item in ${people[*]}
    14. do
    15. echo ${item}
    16. done
    17.  
    18. echo '循环打印联合数组的键值对'
    19. for item in ${!people[@]}
    20. do
    21. echo ${item}-->${people[$item]}
    22. done
    运行结果:
    • 联合数组的key值为:num1 num2 num3
    • 联合数组元素值为:xiaohong xiaobai xiaohei
    • 联合数组的长度为:3
    • 循环打印联合数组的key值
    • num1
    • num2
    • num3
    • 循环打印联合数组的元素值
    • xiaohong
    • xiaobai
    • xiaohei
    • 循环打印联合数组的键值对
    • num1-->xiaohong
    • num2-->xiaobai
    • num3-->xiaohei

    总结:

    1、定义 list1=(a b c)
    2、获取item个数: ${#list1[@]} ${#list1[*]}
    3、获取某个item:${list1[0]},${list1[1]}
    4、转换成以空格分隔各item的字符串: str=${list1[*]} str=${list1[@]}
    5、把以空格分隔的字符串转换成list:str="a b c"; list1=($str); echo ${#list1[@]};

     
  • 相关阅读:
    更改默认alert框体
    自定义垂直拖动的seekbar进度条
    android适配pad和部分手机底部虚拟按键+沉浸式状态栏
    解决studio的URI is not registered (Setting|Language&Frameworks|Schemas and DTDs)
    王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门
    王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍
    使用python(command line)出现的ImportError: No module named 'xxx'问题
    Android Studio生成keystore签名文件步骤讲解
    greendao数据库初次使用的配置及多表关联的初始化
    android视频双向实时通讯的横竖屏切换
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12069491.html
Copyright © 2011-2022 走看看