确定数组在Bash中的if/Then语句中是否有元素



我试图确定一个数组是否在if/then语句中有元素,如下所示:

if [[ -n "$aws_user_group" && -n "${#aws_user_roles[@]}" ]]; then
echo "$aws_user_name,$aws_user_group,"${aws_user_roles[*]}",$aws_key,$aws_account_number" >> "$ofile"
elif [[ -n "$aws_user_group" ]]; then
echo "$aws_user_name,$aws_user_group,,$aws_key,$aws_account_number" >> "$ofile"
fi 

问题是,如果数组为空,它将由"0"表示,如此调试输出中所示:

[[ -n 0 ]]

打印出错误的行。它打印包含"角色"输出的行,但将其留空。

如何在同一if/then语句中检查字符串变量和数学变量?

零是元素的数量。使用数学评估。

if (( ${#aws_user_roles[@]} )) # HAS ELEMENTS
then echo has elements
else echo is empty
fi

示例

$: declare -i foo=()
$: if (( ${#foo[@]})); then echo elements; else echo empty; fi
empty
$: foo=( 1 2 3 )
$: if (( ${#foo[@]})); then echo elements; else echo empty; fi
elements

作为旁白。。。

$: foo=( 1 2 3 )
$: if (( ${#foo})); then echo elements; else echo empty; fi
elements

同样有效,但${#foo}实际上只关注第一个元素的字符串长度,理论上可能会给您一个错误的响应。。。尽管CCD_ 2返回1。嗯…

你也可以为其他事情进行链式测试-

if (( ${#var} )) && [[ -e "$var" ]] # both must succeed

这与一个线性测试相同

ls a && ls b || echo one of these doesn't exist...

最新更新