• linux shell数组与字典用法总结


    shell里面也有数组和所谓的字典,数组分为索引数组和关联数组(关联数组也就是在其他语言里面的字典,在数组和字典的操作方式基本一致)。

    1. 数组

    1.1 创建数组

    - 创建空数组

    `names=()`

    - 数组添加元素

    1. names=()
    2. declare -p names
    3. declare -a names=()
    4. names+="beijing"
    5. declare -p names
    6. declare -a names=([0]="beijing")
    7. names+=("beijing" "shanghai" "guangzhou")
    8. declare -p names
    9. declare -a names=([0]="beijing" [1]="beijing" [2]="shanghai" [3]="guangzhou")

    - 空格分开的字符串用括号包围

    `names=("Bob" "Peter" "$USER" "Big Bad John")`

    - 指定索引号,索引号不连续的也叫稀疏数组

    `names=([0]="Bob" [1]="Peter" [20]="$USER" [21]="Big Bad John")`

    - 指定索引号,且单独定义

    `names[0]="Bob"`

    - 指定路径加通配符

    1. `photos=(~/"My Photos"/*.jpg)`
    2. `files=(*)`

    - 显示定义并初始化

    `declare -a myfiles='([0]="/home/a/.bashrc" [1]="billing codes.xlsx" [2]="hello.c")'`

    - for循环初始化

    - 多个数组合并为一个数组

    1. names=(beijing shanghai)
    2. ages=(19 20 99)
    3. etcs=(${names[@]} ${ages[@]})
    4. declare -p etcs
    5. declare -a etcs=([0]="beijing" [1]="shanghai" [2]="19" [3]="20" [4]="99")

    - 数组元素模式匹配(搜索替换元素值)

    1. # 精确匹配
    2. names=(beijing shanghai)
    3. new_names=(${names[@]/hai/guangzhou})
    4. declare -p new_names
    5. declare -a new_names=([0]="beijing" [1]="shangguangzhou")
    6. # 模糊匹配
    7. names=(beijing shanghai)
    8. new_names=(${names[@]/*hai/guangzhou})
    9. declare -p new_names
    10. declare -a new_names=([0]="beijing" [1]="guangzhou")

    1.2 访问数组

    - 访问数组通常直接用数组下标访问

    1. char=(a b c q w x y z)
    2. echo "${char[2]}"
    3. c

    - 数组的分片访问指定位置

    1. # 表示从下标为3的位置开始访问2个元素
    2. arr=(able good fly python java test go now)
    3. echo "${arr[@]:3:2}"
    4. python java

    - 获取指定下标的元素值的字符个数

    1. arr=(able good fly python java test go now)
    2. echo "${#arr[3]}"
    3. 6

    1.3 遍历数组

    - 打印出变量的类型、值

    1. `declare -p myfiles`
    2. - 使用`printf`循环打印:`${myfiles[@]}`可以理解为`$@`所有的位置参数
    3. `printf '%s\n' "${myfiles[@]}"`

    - 显示for循环打印:

    1. for file in "${myfiles[@]}"
    2. do
    3. cp "$file" /backups/
    4. done

    - 使用`"${myfiles[@]}"`代替for循环

    1. myfiles=(db.sql home.tbz2 etc.tbz2)
    2. cp "${myfiles[@]}" /backups/

    - 一次性输出可读性高的字符串连接

    1. names=("Bob" "Peter" "$USER" "Big Bad John")
    2. echo "Today's contestants are: ${names[*]}"
    3. Today's contestants are: Bob Peter lhunath Big Bad John

    - 获取元素个数

    1. $ array=(a b c)
    2. $ echo ${#array[@]}
    3. 3
    4. declare -a myfiles='([0]=".bashrc" [1]="billing codes.xlsx" [4]="hello.c")'
    5. echo ${#myfiles[@]}
    6. 3

    - 遍历数组的`index`

    1. $ first=(Jessica Sue Peter)
    2. $ last=(Jones Storm Parker)
    3. for i in "${!first[@]}"; do
    4. echo "${first[i]} ${last[i]}"
    5. done
    6. 结果
    7. Jessica Jones
    8. Sue Storm
    9. Peter Parker

    - 类似c语言的遍历数组下标,但是步长为2

    1. char=(a b c q w x y z)
    2. for ((i=0; i
    3. echo "${char[i]} and ${char[i+1]}"
    4. done
    5. 结果
    6. a and b
    7. c and q
    8. w and x
    9. y and z

    1.4 删除元素

    1. char=(a b c q w x y z)
    2. declare -p char
    3. declare -a char=([0]="a" [1]="b" [2]="c" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")
    4. unset char[2]
    5. declare -p char
    6. declare -a char=([0]="a" [1]="b" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")

    2. 字典

    bash里面的字典叫做关联数组,字典其实和数组类似,不同点在于,字典的key是字符串,并且遍历时是随机的。

    **注意事项:**

    - 字典的key遍历是随机的顺序, 它不适合存放顺序的元素

    - 除了遍历是随机的外, 字典的用法基本和数组是一致的

    2.1 创建字典

    - 显示声明并初始化方法1

    1. declare -A fullNames
    2. fullNames=( ["lhunath"]="Maarten Billemont" ["greycat"]="Greg Wooledge" )
    3. echo "I'am ${fullNames[greycat]}."

    - 显示声明并初始化方法2

    1. $ declare -A dict
    2. $ dict[astro]="Foo Bar"
    3. $ declare -p dict
    4. declare -A dict='([astro]="Foo Bar")'

    2.2 遍历字典

    - 像遍历数组一样,只不过index是字符串了

    1. for user in "${!fullNames[@]}"; do
    2. echo "User: $user, full name: ${fullNames[$user]}."
    3. done
    4. User: lhunath, full name: Maarten Billemont.
    5. User: greycat, full name: Greg Wooledge.

    3. 总结

    - `for value in "${myfiles[@]}"` 表示遍历数组的元素值

    - 打印字典指定key的value echo ${dic["key1"]}

    - 打印字典所有key值 echo ${!dic[*]}

    - 打印字典所有value echo ${dic[*]}

    - `for index in "${!myfiles[@]}"` 表示遍历数组的下标号

    - `echo "${#myfiles[@]}"` 表示获取数组的元素个数

    - `echo "${names[*]}"` 表示一次性的打印成字符串便于阅读

    - `declare -a variable` 表示定义一个数组

    - `declare -A variable` 表示定义一个字典

    - `declare -p variable` 表示打印遍历variable的类型、值

  • 相关阅读:
    XML与html解析,区别,如何使用
    初阶指针---从入门到入坟
    Java基础面试题
    MySQL数据表操作实战
    Jeewx-api 1.4.9版本发布—第三方APP开发SDK,支持微信、钉钉、企业微信、小程序等
    从new File("")到jdk源码
    搞笑短视频如何撰写脚本?分享简单小技巧
    申报绿色工厂的流程、费用和资料大全。
    架构道术-企业选择Dubbo作为分布式服务框架的10个理由
    Zero-Shot Learning by Harnessing Adversarial Samples 理论 & 代码解读
  • 原文地址:https://blog.csdn.net/lovedingd/article/details/126531139