博主
发布于 2025-01-25 / 13 阅读 / 0 评论 / 0 点赞

03.数组的使用

shell中数组的使用

shell中包含多个元素的变量称为数组,类似Python中的列表和字典。

在shell中没有字典或者java中的映射。但是可以通过关联数组的方法实现相同的功能。

1、索引数组/普通数组/列表

定义一个数组,有2种方法,简单使用和标准使用2种方法

简单使用

定义和使用较为简单,但是无法定义使用包含空格的元素。

要点如下:

  1. 数组整体用单引号或双引号包裹。
  2. 元素之间用空格分开
  3. 调用元素可以通过$var-name 的方式实现
  4. 简单使用只能遍历元素,无法单独调用1个或多个。

示例如下:

[root@k8s01 study-shell]# cat 01-lst.sh 
#!/bin/bash
a="a b c"
for i in $a
do
echo $i
done

[root@k8s01 study-shell]# bash 01-lst.sh 
a
b
c
[root@k8s01 study-shell]# 

标准使用

标准使用方法通用性强,但是书写较为麻烦,但是为了避免不必要的问题,推荐使用标准方法

要点如下:

  1. 数组整体用小括号包裹
  2. 元素之间用空格或换行分割,多个连续空格或换行视为1个
  3. 每个元素用单引号或双引号包裹,特殊的无空格的元素可以不包裹,但仍推荐包裹
  4. 调用时需要用双引号包裹

示例如下:

  1. 遍历数组元素

    [root@k8s01 study-shell]# cat 02-lst.sh 
    #!/bin/bash
    a=(a a "b b" 'c c')
    for i in "${a[@]}"
    do
    echo $i
    done
    [root@k8s01 study-shell]# bash 02-lst.sh 
    a
    a
    b b
    c c
    [root@k8s01 study-shell]# 
    
    
  2. 调用单个元素

    单个调用使用下标号调用,第一个元素下标为0,依次类推,最后一个元素下标为-1,依次类推

    示例如下:

    [root@k8s01 study-shell]# cat 05-lst.sh 
    #!/bin/bash
    a=(
    a1 a2 "b b" 'c c'
    'd d'
    )
    echo "${a[1]}"
    echo "${a[-1]}"
    [root@k8s01 study-shell]# bash 05-lst.sh 
    a2
    d d
    [root@k8s01 study-shell]# 
    
    
  3. 获取数组长度

    数组长度通过#符号获取

    示例如下

    [root@k8s01 study-shell]# cat 06-lst.sh 
    #!/bin/bash
    a=(
    a1 a2 "b b" 'c c'
    'd d'
    )
    echo "array lenth is ${#a[@]}"
    [root@k8s01 study-shell]# bash 06-lst.sh 
    array lenth is 5
    [root@k8s01 study-shell]# 
    
    
  4. 数组切片

    如果选取连续多个元素称为数组切片,格式为${array-name[@]:start_index:length}

    示例如下

    [root@k8s01 study-shell]# cat 07.lst.sh 
    #!/bin/bash
    a=(
    a1 a2 "b b" 'c c'
    'd d'
    )
    echo "${a[@]:1:2}"
    for i in "${a[@]:1:2}"
    do
    echo $i
    done
    [root@k8s01 study-shell]# bash 07.lst.sh 
    a2 b b
    a2
    b b
    [root@k8s01 study-shell]# 
    
  5. 删除元素

    删除元素的格式为:unset array-name[index]

    [root@k8s01 study-shell]# cat 08.lst.sh 
    #!/bin/bash
    a=(
    a1 a2 "b b" 'c c'
    'd d'
    )
    # 删除下标为1的元素
    unset a[1]
    for i in "${a[@]}"
    do
    echo $i
    done
    [root@k8s01 study-shell]# bash 08.lst.sh 
    a1
    b b
    c c
    d d
    [root@k8s01 study-shell]# 
    
    
  6. 增加元素

    增加元素类似于将后面的数组元素增加到前面的数组中,用符号+=实现,格式为array-name+=("element1" "elemetn2"),注意要加入的内容要符合数组定义格式规范。

    shell中数组原生只支持这种末尾增加,如果需要在前面或者中间增加,需要自己配合下标形成新的数组,然后覆盖使用

    [root@k8s01 study-shell]# cat 10.lst.sh 
    #!/bin/bash
    a=(
    a1 a2 "b b" 'c c'
    'd d'
    )
    a+=("e e" 'f f')
    for i in "${a[@]}"
    do
    echo $i
    done
    [root@k8s01 study-shell]# bash 10.lst.sh 
    a1
    a2
    b b
    c c
    d d
    e e
    f f
    [root@k8s01 study-shell]# 
    

2、关联数组/字典/映射

关联数组需要先声明,再使用,-A表示声明的是关联数组,格式如下

declare -A dict-name

基本定义与遍历

示例如下

[root@k8s01 study-shell]# cat 11.lst.sh 
#!/bin/bash
# 定义一个关联数组
declare -A mydict
# 插入值
mydict['name']='Martin'
mydict['age']=18
# 遍历数组
for i in "${!aaa[@]}"
do 
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 11.lst.sh 
name:Martin
age:18
[root@k8s01 study-shell]# 

也可以用键值对的形式给关联数组赋值

示例如下

[root@k8s01 study-shell]# cat 11.lst.sh 
#!/bin/bash
# 定义一个关联数组
declare -A aaa
# 插入值
aaa=(
['name']='martin'
['age']=18
)
for i in "${!aaa[@]}"
do 
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 11.lst.sh 
name:martin
age:18
[root@k8s01 study-shell]# 

关联数组合并

关联数组合并没有原生的命令,可以通过将后一个数组的键值一一添加进前一个数组中实现

示例如下:

[root@k8s01 study-shell]# cat 12.lst.sh 
#!/bin/bash
# 定义一个关联数组
declare -A aaa
declare -A bbb
# 插入值
aaa=(
['name']='martin'
['age']=18
)
bbb=(
['sex']='male'
)
for i in "${!bbb[@]}"
do 
aaa[${i}]="${bbb[${i}]}"
done


for i in "${!aaa[@]}"
do 
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 12.lst.sh 
name:martin
age:18
sex:male
[root@k8s01 study-shell]# 

评论