我有一个数组:
arr=($A $B)
我想确保 A 和 B 都存在。我怎样才能做到这一点?没有在数组声明之前手动检查每个元素?
在扩展可能未设置的 shell 变量时,您有以下选择: 您可以用默认值代替未设置的值;您可以将变量设置为默认值,然后替换它;或者您可以引发错误。
以下是 bash 手册中的详细信息:
${parameter:-word}
使用默认值。如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。
${parameter:=word}
分配默认值。如果参数未设置或为空,则将单词的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
${parameter:?word}
如果为 Null 或未设置,则显示错误。如果 parameter 为 null 或未设置,则 word 的扩展(或者如果 word 不存在,则将产生一条消息)写入标准错误,并且 shell,如果它不是交互式的,则退出。否则,参数的值被替换。
所以如果要引发错误,最简单的用法如下。您可以在问号后添加自定义消息:
% echo ${UNSET?}
-bash: UNSET: parameter null or not set
根据您的需要,为A
and提供默认值可能就足够了B
arr=("${A:-one}" "${B:-two}")
有一个 shell 选项可用于在任何使用未设置变量时生成错误,但对于您的用例而言,它可能过于笼统。
$ set -u
$ A=6
$ arr=($A $B)
bash: B: unbound variable
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