【问题标题】:BASH: How can I check if the Environmental variables comprising an array exist?BASH:如何检查包含数组的环境变量是否存在?
【发布时间】:2013-10-22 04:34:58
【问题描述】:

我有一个数组:

arr=($A $B)

我想确保 A 和 B 都存在。我怎样才能做到这一点?没有在数组声明之前手动检查每个元素?

【问题讨论】:

    标签: arrays bash element exists


    【解决方案1】:

    扩展可能未设置的 shell 变量时,您有以下选择: 您可以将默认值替换为未设置的值;您可以将变量设置为默认值,然后替换它;或者您可以引发错误。

    以下是 bash 手册中的详细信息:

    ${parameter:-word}
    使用默认值。如果参数未设置或为空,则展开 的单词被替换。否则,参数的值为 替换。

    ${parameter:=word}
    分配默认值。如果参数未设置或为空,则 词的扩展被分配给参数。参数值 然后被替换。位置参数和特殊 不能以这种方式分配参数。

    ${parameter:?word}
    如果为 Null 或未设置,则显示错误。如果参数为空或未设置, 词的扩展(或者如果词是 不存在)被写入标准错误和外壳,如果 它不是交互式的,退出。否则,参数的值 被替换了。

    所以如果要引发错误,最简单的用法如下。您可以在问号后添加自定义消息:

    % echo ${UNSET?}
    -bash: UNSET: parameter null or not set
    

    【讨论】:

      【解决方案2】:

      根据您的需要,为AB 提供默认值可能就足够了

      arr=("${A:-one}" "${B:-two}")
      

      【讨论】:

        【解决方案3】:
        unset A B
        arr=("$A" "$B")
        set | grep ^arr=
        
        arr=([0]="" [1]="")
        

        好的,您可以使用循环检查所有值:

        for ((_i=0;_i<${#arr[@]};_i++));do
            [ -n "${arr[_i]}" ] || {
                printf -v _v %03o $((65+_i))
                printf "empty $%b\n" \\$_v
             }
           done
        empty $A
        empty $B
        
        A="aa bb"
        arr=("$A" "$B")
        set | grep ^arr=
        arr=([0]="aa bb" [1]="")
        for ((_i=0;_i<${#arr[@]};_i++));do
            [ -n "${arr[_i]}" ] || {
                printf -v _v %03o $((65+_i))
                printf "empty $%b\n" \\$_v
             }
           done
        empty $B
        

        【讨论】:

          【解决方案4】:

          有一个 shell 选项可以在 任何 使用未设置的变量时生成错误,但它可能对您的用例来说太笼统了。

          $ set -u
          $ A=6
          $ arr=($A $B)
          bash: B: unbound variable
          

          【讨论】:

            猜你喜欢
            • 2012-04-28
            • 2016-10-03
            • 1970-01-01
            • 2017-08-30
            • 2013-08-12
            • 2023-04-09
            • 2023-03-07
            • 2011-01-21
            • 1970-01-01
            相关资源
            最近更新 更多