美文网首页
5、set 、数组

5、set 、数组

作者: 沙砾丶ye | 来源:发表于2019-12-26 08:05 被阅读0次

    Shell_set用法

    set -u

    当脚本中遇到未定义的变量时,默认是忽略。

    有时候这并不是开发者想要的。

    假如有未定义的变量,应该报错,并且终止脚本继续运行。

    set -u 就可以办到

    #!/usr/bin/env bash
    set -u
    
    echo $a
    echo shark
    

    执行报如下错误

    $ bash set.sh
    set.sh: line 13: a: unbound variable
    
    image.png
    注意
    set -u
    
    a=`ls |grep 'asfdasdf'`
    echo "|$a|"
    
    # -u  只针对未定义的变量有效
    # 这种情况,变量的值会是一个空字符串
    # 所以脚本会继续执行
    

    set -e

    set -e 的作用就是:
    在脚本执行中,有任何命令的返回值是非 0 的情况,则正在运行的脚本则会退出

    设置 -e 之前

    [root@kube-master set]# cat set-e-before.sh
    #!/bin/sh
    foo
    echo "继续执行"
    

    执行结果

    [root@kube-master set]# sh set-e-before.sh
    set-e-before.sh: line 3: foo: command not found
    继续执行
    

    设置 -e 之后
    解决办法是在脚本中设置 set -e

    [root@kube-master set]# cat set-e-after.sh
    #!/bin/sh
    
    set -e
    foo
    echo "继续执行"
    

    执行结果

    root@kube-master set]# sh set-e-after.sh
    set-e-after.sh: line 5: foo: command not found
    

    但是,对于一组含有管道的命令无效,比如:

    #!/usr/bin/env bash
    set -e
    foo | echo "shark"    # 注意这里有管道符
    echo  "程序会继续运行"
    

    执行结果

    [root@kube-master set]# sh set-e.sh
    shark
    set-e.sh: line 2: foo: command not found   # 这是报错信息
    程序会继续运行
    

    foo 不是 shell 中的命令,执行会报错,但是其后面有个管道,最终管道后的 echo 命令执行成功了,这种情况下 脚本会继续执行。

    解决办法是使用下面的 set -o pipefail

    set -o pipefail

    要和 set -e 配合使用。
    如果设置,如果管道中的所有命令都成功退出,整条命令的返回值才是 0。否则返回非 0。
    默认情况下禁用此选项

    示例脚本内容

    # 设置 set -o pipefail 后,此时脚本就会终止运行
    set -e
    set -o pipefail
    foo |echo ''
    echo shark
    

    执行效果

    [root@kube-master set]# sh set-e-pipefail.sh
    
    set-e-pipefail.sh: line 4: foo: command not found
    

    Shell_数组

    数组 (array) 变量类型

    数组中的值: wukong  bajie  shaseng
    值的索引号: 0      1     2

    数组的索引只能是 整数

    # 定义一个数组
    var=(wukong bajie shaseng)
    
    echo ${var[2]} //显示数组中索引号为 2 的值,索引号从 0 开始
    输出 shaseng
    
    echo ${var[*]}  //显示数组中所有的值
    输出 wukong bajie shaseng
    

    定义数组,并且其值从命令的结果中获取

    # 把文件中的每一行作为数组中的一个值
    line=(`cat /etc/passwd`)
    

    declare 声明关联数组

    数组的索引可以是 普通字符串

    声明关联数组使用 A 选项

    declare -A  数组名称
    

    1. 声明

    # 声明关联数组,数组名称为 info
    [shark@sharkyun ~]$ declare -A   info
    

    2. 添加值

    每次添加一个值,可以追加
    示例:

    [shark@sharkyun ~]$ info[name]=shark
    [shark@sharkyun ~]$ info[age]=18
    [shark@sharkyun ~]$ echo ${info[name]}  # 显示索引对应的值
    shark
    [shark@sharkyun ~]$ echo ${info[age]}
    18
    

    一次添加所以的值,不可以追加,每次都会覆盖上次的值
    每个值之间使用 空格 隔开
    var=([key1]="value1" [key2]="value2")
    示例:

    [root@kube-master script]# declare -A color
    [root@kube-master script]# color=(["red"]="#ff0000", ["green"]="#00ff00")
    [root@kube-master script]# echo ${color[*]}
    #ff0000, #00ff00
    [root@kube-master script]# color=(["a"]="#ff")   # 这样会覆盖原来的值,因为这是在重新定义变量  color
    [root@kube-master script]# echo ${color[*]}
    #ff
    [root@kube-master script]# color=(["b"]="ff")
    [root@kube-master script]# echo ${color[*]}
    ff
    [root@kube-master script]# color[c]="#cc"
    [root@kube-master script]# echo ${color[*]}
    ff #cc
    [root@kube-master script]# echo ${!color[*]}  # 获取所有的 索引号
    b c
    [root@kube-master script]# echo ${#color[*]}  # 统计数组中有多少个键值对
    2
    

    删除

    [root@kube-master arry]# unset info[name]
    [root@kube-master arry]# echo ${!info[*]}
    age
    

    相关文章

      网友评论

          本文标题:5、set 、数组

          本文链接:https://www.haomeiwen.com/subject/ivzwnctx.html