• Shell系统学习之数组


    目录

    如何定义数组

    通过指定元素值来定义数组

    通过元素集合来定义

    通过键值对集合定义数组

    key为字符串的数组

    数组和普通变量的关系

    数组的赋值

    单个项赋值

    整体替换赋值

     数组添加新元素

    访问数组

    访问第一个数组

    按下标访问

    计算数组长度

    引用所有的数组元素

    通过循环遍历数组

     以切片方式获取部分数组元素

    数组元素的替换

    删除数组 

    数值的其他操作

    复制数组 

     连接数组

    加载文件内容到数组变量

    小结 


    如何定义数组

    通过指定元素值来定义数组

    语法如下:

    array[key]=value

     array为数组名,key为元素索引,一般为整数(要求key>=0),value为对应元素的值,后面我们再讲key为字符串的情况。

    下面看个简单的示例

    1. #!/bin/bash
    2. array[1]=one
    3. array[3]=3
    4. #数组所有元素的值
    5. echo ${array[@]}
    6. #数组长度
    7. echo ${#array[@]}

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-1.sh 
    one 3
    2

    Shell的数组下标也是从0开始的,但是可以看出key不一定要连续。

    通过元素集合来定义

    定义时,一次性为数组所有元素提供一个值,语法为:

    array=(v0 v1 v2 ...)

    Shell会将这些值从下标0的元素开始,依次将这些值赋值给所有元素,看示例:

    1. #!/bin/bash
    2. array=(1 2 3 4 5)
    3. #数组下标为0的元素值
    4. echo "${array[0]}"
    5. #数组所有元素的值
    6. echo "${array[@]}"
    7. #数组长度
    8. echo "${#array[@]}"

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-2.sh 
    1
    1 2 3 4 5
    5

    通过键值对集合定义数组

     语法如下:

    array=([0]=v0 [1]=v1 [2]=v2 ...)

    []符号里是key,=号右边是对应的value,这里key不要求连续,看示例

    1. #!/bin/bash
    2. array=([1]=one [4]=four)
    3. echo "${array[4]}"
    4. echo "${array[@]}"
    5. echo "${#array[@]}"

    结果如下:

     eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-3.sh 

    four
    one four
    2

    key为字符串的数组

     前面说了key可以为整数,也可以为字符串。为字符串时,我们成此数组为关联数组。

    关联数组只有bash 4.0以上版本才支持,如何查看bash版本?

    在Shell控制台按ctrl+x,然后ctrl+v,bash的版本信息就会显示在控制台上。

    关联数组的定义和上面一样,只是key换为字符串。由一点区别是,需要使用declare命令定义,然后才能开始赋值。

    declare -A array_name

    array_name就是数组名。

    数组和普通变量的关系

    可以这么理解,Shell中的所有变量都是数组类型,普通变量是一个长度为1,下标为0的数组。

    请看示例:

    1. #!/bin/bash
    2. array="hello world!"
    3. echo "${array}"
    4. echo "${array[0]}"
    5. echo "${array[@]}"
    6. echo "${#array[@]}"

     结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-4.sh 
    hello world!
    hello world!
    hello world!
    1

    数组的赋值

    单个项赋值

    array[n]=value

     通过指定下标进行赋值。

    整体替换赋值

    array=(v0 v1 v2 ...)

    与前面定义一样,这种方式会将整个数组重新赋值,包括长度和值。举个例子:

    1. #!/bin/bash
    2. array=(a b "c d" e)
    3. echo ${array[@]}
    4. echo ${#array[@]}
    5. array=(1 2 3)
    6. echo ${array[@]}
    7. echo ${#array[@]}

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-5.sh 
    a b c d e
    4
    1 2 3
    3

     数组添加新元素

    与单个项赋值一样,如果该项key不存在,使用 

    array[n]=value

    赋值方法就会新增这一项。

    访问数组

    访问第一个数组

    访问第一个数组可以直接用${array_name}的方式,就像前面数组和普通变量的关系说明的一样。

    按下标访问

    array[n]

    这个就是按照key来访问:前面示例已经由使用这种方式

    计算数组长度

    前面的示例也已经展示

    ${#array_name[@]}

     或者${#array_name[*]},获取数组长度。

    还可以获取数组中某项值的长度

    ${#array_name[n]}

    n表示下标。请看示例:

    1. #!/bin/bash
    2. array=("ubuntu" "Debian" "Suse")
    3. echo "${array[0]}"
    4. #ubuntu字符串长度
    5. echo "${#array[0]}"

    结果为:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-6.sh 
    ubuntu
    6

    引用所有的数组元素

    前面示例也已经展示,命令为:

    ${array_name[@]}

    或者 ${array_name[*]}

    通过循环遍历数组

    这个在之前的文章由讲过,请查看

    Shell系统学习之循环结构_edenliuJ的博客-CSDN博客 

     以切片方式获取部分数组元素

    与python中的切片方式类似:

    ${array_name[@]:start:lenght}

    将@换成*是一样的。

    start表示起始下标,lenght表示从起始下标开始截取的数组元素的个数。

    1. #!/bin/bash
    2. array=("ubuntu" "Debian" "Suse")
    3. echo "${array[@]}"
    4. #从下标1开始截取2个元素
    5. echo "${array[@]:1:2}"

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-7.sh 
    ubuntu Debian Suse
    Debian Suse

    我们也可以截取某一项数组元素,语法如下:

     

    ${array_name[n]:start:lenght}

    请看示例:

    1. #!/bin/bash
    2. array=("ubuntu" "Debian" "Suse")
    3. echo "${array[0]}"
    4. #截取ubuntu
    5. echo "${array[0]:2:4}"

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-8.sh 
    ubuntu
    untu

     如果lenght超过了数组或者数组元素的大小,都只会截取到数组或者数组元素的末尾。

    数组元素的替换

    对数组元素的部分内容用其他字符串来替换,但是并不影响原数组的值,数值元素替换命令如下:

    ${array_name[@]/pattern/replacement}

    pattern表示要搜索的字符串,replacement表示用来替换的字符串。注意这个是可以部分替换的,不是说一定要元素值完全等于pattern才能替换,只要元素值中包含了pattern的内容,就会被替换掉。下面请看示例

    1. #!/bin/bash
    2. array=(1 2 44 55 123)
    3. echo "${array[@]/1/3}"
    4. #不会改变原数组的值
    5. echo "${array[@]}"
    6. a=("${array[@]/1/3}")
    7. echo "${a[@]}"

    结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-9.sh 
    3 2 44 55 323
    1 2 44 55 123
    3 2 44 55 323

    删除数组 

    使用unset命令可以删除数组中的一项或者整个数组

    删除一项:

    unset array_name[n]

     删除整个数组

    unset array_name

    数值的其他操作

    复制数组 

    前面示例已经有展示,命令如下:

    new_array_name=("${array_name[@]}")

     连接数组

    连接数组是将多个数组连接在一起,组合成一个数组。新的数组依次包含连接进来数组的元素。语法如下:

    ("$array1[@]" "$array2[@]" ...)

    请看示例: 

    1. #!/bin/bash
    2. a1=(1 2 3 4)
    3. a2=(one two three four)
    4. a3=("bash" "csh")
    5. a4=("${a1[@]}" "${a2[@]}" "${a3[@]}")
    6. echo "${a4[@]}"
    7. echo "${#a4[@]}"

     结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-10.sh 
    1 2 3 4 one two three four bash csh
    10

    加载文件内容到数组变量

    用户可以将普通文件的文本文件的内容直接加载到数组中,文件中每一行构成数组一个元素的内容。

    首先准备一个文件,该文件比较简单,比如:

     eden_ubuntu@edenubuntu:~/Documents/Shell/7$ cat demo.txt 
    123
    456
    789

    使用cat命令,将文件内容加载到数组变量中,请看下面示例:

    1. #!/bin/bash
    2. content=(`cat demo.txt`)
    3. echo "${content[@]}"
    4. echo "${#content[@]}"

     结果如下:

    eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-11.sh 
    123 456 789
    3

    小结 

    本篇文章主要介绍Shell中数组的定义,赋值,访问,切片访问,删除以及其他的一些操作比如,拷贝,连接,加载文件内容到数组等。 

  • 相关阅读:
    C++ Date 类的编写
    TartanVO: A Generalizable Learning-based VO 服务器复现(rtx3090 py3)
    windows下app爬虫环境搭建:python + fiddler + Appium + 夜神模拟器
    postgres源码解析37 表创建执行全流程梳理--1
    等保三级安全要求简要攻略-安全计算环境
    Pandas缺失值inf与nan处理实践
    回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测
    鸿蒙 Harmony ArkTs开发教程三 流程控制
    JS数据类型判断方式总结
    【Docker安装部署RocketMQ消息中间件详细教程】
  • 原文地址:https://blog.csdn.net/MashiMaroJ/article/details/126058868