• 【shell脚本编写】shell 数组的使用


    数组

    速查

    操作命令作用
    创建数组declare -a array1=‘([2]=“zhangfei”)’逐个元素定义数组
    array2=(sunquan zhouyu “lu su”)从列表定义数组 注意括号就相当于数组的定义
    array3=(`cat /etc/user_name.txt`)从文件定义数组
    array1+=(value1)
    array1+=(value1,value2…valueN)
    array1+=(${var1})
    append【+=】方式创建数组,注意加括号()
    删除unset array1[0]删除元素:unset 数组名[索引]
    unset array1删除数组:unset 数组名
    打印数组内容echo ${array1[@]}打印所有值
    echo ${array1[0]}打印单个值
    echo ${array1[@]:2:2}${数组名[@]:M:N} 打印多个值,打印下标M开始的N个元素
    此处就是下标2开始的2个元素
    echo ${#array1[@]}统计数组元数的个数
    echo ${!array1[@]}获取数组的索引(也就是 key)
    for i in “${array1[*]}”; do
    echo $i;
    done
    遍历数组
    数组追加元素array_name+=(value1…valueN)使用+=进行追加 常用!
    array_name[index]=value直接使用下标进行元素的追加
    array_name[${#array_name[@]}]=value将数组的长度作为下标进行追加元素 (因为数组下标从0开始,目前数组长度是无值的)
    数组重新赋值array_name=(“${array_name[@]}” value1 …valueN)> 双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个
    > 不能将“@”替换为 “ * ”,如果替换为“ * ”,不加双引号时与"@"的表现一致,加双引号时,会将数组array name中的所有元素作为一个元素添加到数组中

    数组创建与删除

    # 1. 逐个元素定义数组
    # 说明:不必从0开始定义,会自动按索引排序。
    array1[3]=zhangfei
    # declare -a 查看所有数组
    # declare -a |grep array   查看刚定义的数组
    declare -a array1='([2]="zhangfei")'
    
    # 2. 从列表定义数组  注意括号就相当于数组的定义
    array2=(sunquan zhouyu "lu su")
    
    # 3. 从文件定义数组
    array3=(`cat /etc/user_name.txt`)
    
    # 4. append【+=】方式创建数组,注意加括号()
    array1+=(value1)
    array1+=(value1,value2...valueN)
    array1+=${var1}# 5. 删除元素
    # 删除元素:unset 数组名[索引]
    unset array1[0]
    # 删除数组:unset 数组名
    unset array1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    打印数组内容(数量,key 等)

    访问数组中的单个元素:

    • 语法:${数组名[索引]}

    访问数组中多个元素(切片):

    • 语法:${数组名[@]:M:N}
    # 1. 打印所有值
    echo ${array1[@]}
    liubei guanyu zhangfei
    
    # 2. 打印单个值
    echo ${array1[0]}
    liubei
    
    # 3. 打印多个值,切片(数组下标也是从0开始,此处表示【打印从下标1开始2个元素(也就当前和后一个)】)
    echo ${array1[@]:1:2}
    guanyu zhangfei
    
    # 4. 统计数组元数的个数
    echo ${#array1[@]}
    3
    # 注意:即使是从索引1开始取数,仍然会显示总数。测试如下:
    echo ${#array1[@]:1}
    3
    
    # 5. 获取数组的索引(也就是 key)
    echo ${!array1[@]}
    0 1 3
    
    # 6. 遍历数组
    [root@localhost data]#for i in "${a[*]}"; do echo $i; done
    5 3 45 99
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    数组追加元素

    # 1. 方法一 :直接使用下标进行元素的追加
    array_name[index]=value
    # 2. 方法二:将数组的长度作为下标进行追加元素 (因为数组下标从0开始,目前数组长度是无值的)
    array_name[${#array_name[@]}]=value
    # 3. 方法三:重新赋值
    > 双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个
    > 不能将“@”替换为 “ * ”,如果替换为“ * ”,不加双引号时与"@"的表现一致,加双引号时,会将数组array name中的所有元素作为一个元素添加到数组中
    array_name=("${array_name[@]}" value1 ...valueN)
    # 4. 方法四:使用+=进行追加 常用!
    array_name+=(value1...valueN)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用示例

    #!/bin/bash
     
    echo "shell定义字典"
    #必须先声明
    declare -A dic
    dic=([key1]="value1" [key2]="value2" [key3]="value3")
     
    #打印指定key的value
    echo ${dic["key1"]}
    #打印所有key值
    echo ${!dic[*]}
    #打印所有value
    echo ${dic[*]}
     
    #遍历key值
    for key in $(echo ${!dic[*]})
    do
            echo "$key : ${dic[$key]}"
    done
     
    echo "shell定义数组"
     
    #数组
    list=("value1" "value2" "value3")
    #打印指定下标
    echo ${list[1]}
    #打印所有下标
    echo ${!list[*]}
    #打印数组下标
    echo ${list[*]}
    #数组增加一个元素
    list=("${list[@]}" "value3")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    误区注意

    • 数组不是单纯的数组,可以视为【字典】和【数组】的结合

      1. array1[3]=zhangfei 中的 【3】只能是视作 key,不具有排序作用
      2. array1+="test" 新增元素,并没有放到array1[4]位置,而是补齐之前的空位,补到了array1[0]
      3. 数组会自动对新加入的元素进行排序,会忽略空闲位置echo ${array1[@]:0:2},可以看到了打印对应的元素内容test zhangfei
    • append【+=】方式创建数组,注意加括号()

    # 创建数组
    $ array1[3]=zhangfei
    # 查看刚创建的数组
    $ declare -a | grep array
    declare -a array1='([3]="zhangfei")'
    # 可以到定义的 3 只是 key,与数组无关,数组会【自动排序】
    $ echo ${array1[@]:1:2}
    zhangfei
    $ echo ${array1[@]:1:1}
    zhangfei
    # 数组新增元素
    $ array1+="test"
    # 可以看到新增的元素 被赋予一个 key  为 0 
    $ declare -a | grep array
    declare -a array1='([0]="test" [3]="zhangfei")'
    # 查看数组的长度
    $ echo ${#array1[@]}
    2
    # 查看数据的key  相当于查看 dict 的 key
    $ echo ${!array1[@]}
    0 3
    # 可以看到 没找到新增的元素
    $ echo ${array1[@]:1:1}
    zhangfei
    echo ${array1[@]:1:3}
    zhangfei
    # 查看数组位置  可以看到新增的元素 加到 0 位置
    $ declare -a | grep array
    declare -a array1='([0]="test" [3]="zhangfei")'
    $ echo ${array1[@]:0:1}
    test
    $ echo ${array1[@]:0:2}
    test zhangfei
    
    
    $ ip1=10.10.10.1
    $ ip2=20.20.20.2
    # 此处是直接 增添元素 创建数组
    $ ips+=${ip1}
    # 但查找不到
    $ declare -a | grep ips
    $ echo ${ips[@]}
    10.10.10.1
    $ ips+=${ip2}
    # 同时打印全部  没有空格进行间隔
    $ echo ${ips[@]}
    10.10.10.120.20.20.2
    # 可以看到全都存储在 key 为 0 中
    $ echo ${ips[0]}
    10.10.10.120.20.20.2
    # 获取全部 key
    $ echo ${!ips[@]}
    0
    
    # 注意加括号
    # 首先删除数组
    $ unset ips
    # 加括号方式创建
    $ ips+=(${ip1})
    $ ips+=(${ip2})
    $ declare -a | grep ips
    declare -a ips='([0]="10.10.10.1" [1]="20.20.20.2")'
    $ echo ${!ips[@]}
    0 1
    $ echo ${ips[0]}
    10.10.10.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    [dx12]Flip, VSync 和 GSync
    7.2.7 【MySQL】用于分组
    c# Parallel.For 循环内多线程并行操作
    LeetCode:66.加一
    基于知名微服务框架go-micro开发gRPC应用程序
    回归预测 | MATLAB实现PCA-GRU主成分门控循环单元多输入单输出回归预测
    AI诈骗的防范与应对:维护数字安全的责任
    探索一种C++中构造对象的方式
    云计算时代:SFP、SFP+、SFP28、QSFP+和QSFP28光纤模块详解
    PHP变量底层原理
  • 原文地址:https://blog.csdn.net/qq_24433609/article/details/128133275