Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays BASH:如何检查组成数组的环境变量是否存在?_Arrays_Bash_Element_Exists - Fatal编程技术网

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

Arrays BASH:如何检查组成数组的环境变量是否存在?,arrays,bash,element,exists,Arrays,Bash,Element,Exists,我有一个数组: arr=($A $B) 我想确保A和B都存在。我该怎么做?不必在数组声明之前手动检查每个元素?根据需要,为a和B提供一个默认值就足够了 展开可能未设置的shell变量时,有以下选项:可以用默认值替换未设置值;您可以将变量设置为默认值,然后替换它;或者您可以提出一个错误 以下是bash手册中的详细信息: ${参数:-word} 使用默认值。如果参数为unset或null,则扩展 一个字被替换了。否则,参数的值为 替换 ${参数:=word} 指定默认值。如果参数未设置或为null

我有一个数组:

arr=($A $B)

我想确保A和B都存在。我该怎么做?不必在数组声明之前手动检查每个元素?

根据需要,为a和B提供一个默认值就足够了


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

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

${参数:-word} 使用默认值。如果参数为unset或null,则扩展 一个字被替换了。否则,参数的值为 替换

${参数:=word} 指定默认值。如果参数未设置或为null,则 将字的展开指定给参数。参数值 然后被替换。位置参数和特殊 参数不能以这种方式指定给

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

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

% echo ${UNSET?}
-bash: UNSET: parameter null or not set
好的,您可以使用循环检查所有值:

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

有一个shell选项用于在任何未设置变量的使用中生成错误,但对于您的用例来说,它可能过于通用

$ set -u
$ A=6
$ arr=($A $B)
bash: B: unbound variable
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
$ set -u
$ A=6
$ arr=($A $B)
bash: B: unbound variable