首页 > 解决方案 > 在 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 语句中检查字符串变量和数学变量?

标签: bashif-statement

解决方案


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

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

推荐阅读