BASH:如何检查包含数组的环境变量是否存在?

时间:2013-10-14 14:56:31

标签: arrays bash element exists

我有一个数组:

arr=($A $B)

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

4 个答案:

答案 0 :(得分:3)

展开可能未设置的shell变量时,您有以下选项:您可以使用默认值替换未设置的值;您可以将变量设置为默认值,然后替换它;或者你可以提出错误。

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

  

${parameter:-word}
           使用默认值。如果参数未设置或为null,则为扩展            用词代替。否则,参数的值为            取代

     

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

     

${parameter:?word}
                如果为空或未设置则显示错误。如果参数为null或未设置,                 单词的扩展(如果有单词,则为一个消息)                 如果是,则写入标准错误和shell                 它不是互动的,退出。否则,参数的值                 被替代。

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

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

答案 1 :(得分:2)

根据您的需要,为AB

提供默认值可能就足够了
arr=("${A:-one}" "${B:-two}")

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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