我试图确定一个数组是否在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...