我试图确定数组在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语句中检查字符串变量和数学变量?
答案 0 :(得分:1)
零是元素的数量。使用数学评估。
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}
实际上只是看第一个元素的字符串长度,理论上可以给您一个错误的响应...尽管''
返回1。嗯... >
您还可以对其他内容进行链式测试-
if (( ${#var} )) && [[ -e "$var" ]] # both must succeed
这与单线测试相同
ls a && ls b || echo one of these doesn't exist...