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

时间:2018-10-30 18:34:38

标签: bash if-statement

我试图确定数组在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语句中检查字符串变量和数学变量?

1 个答案:

答案 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...