penglongli / blog

18 stars 1 forks source link

Bash 的集合 #45

Open penglongli opened 6 years ago

penglongli commented 6 years ago

写 Bash 总是容易忘...简单总结一下 Bash 的集合主要分为两类:数组和键值对(Map)

declare 关键字

数组

下边主要介绍的是数组的声明、操作、多维数组

声明

声明的时候初始化:

declare -a arr=(var1 var2 var3)

declare -a arr=([0]=var1 [1]=var2)

声明但是不初始化:

declare -a arr=()
arr[0]=var1
arr[1]=var2

操作

遍历

关于数组的遍历

  1. for-in
    
    #!/bin/bash

declare -a arr=(var1 var2 var3 var4 var5)

for ITEM in ${arr[@]} do echo ${ITEM} done

2. 下标
```shell
#!/bin/bash

declare -a arr=(var1 var2 var3 var4 var5)

for ((i=0; i<${#arr[@]}; i++))
do
    echo ${arr[${i}]}
done

排序

#!/bin/bash

declare -a arr=(var1 var3 var0 var2 var8 var6)

IFS=$'\n' sorted=($(sort <<<"${arr[*]}"))
echo ${sorted[@]}

#!/bin/bash

declare -a arr=(var1 var3 var0 var2 var8 var6)

sorted=($(
    for item in "${arr[@]}"
    do
        echo "${item}"
    done | sort
))

echo ${sorted[@]}

关于 IFS,参考:

map

声明

初始化声明:

eclare -A map=(["var1"]=1 ["var2"]=2 ["var3"]=3)

未初始化声明:

declare -A map=()

map["var1"]=1
map["var2"]=2
map["var3"]=3

操作

遍历

eclare -A map=(["var1"]=1 ["var2"]=2 ["var3"]=3)

for key in ${!map[@]}
do
    echo ${map[${key}]}
done

引申使用

删除子数组

当数组 B 是数组 A 的一个子集的时候,求 A 与 B 的差集

#!/bin/bash

declare -a A=(var1 var2 var3 var4)
declare -a B=(var2 var3)

for ((i=0; i<${#A[@]}; i++))
do

    if echo "${B[@]}" | grep -w "${A[$i]}"&>/dev/null; then
        unset A[$i]
    fi
done
echo ${A[@]}

循环遍历 A 数组,比较 A 的元素是否在 B 数组中。如果在则删除。