如何批量检查数组值是否为空?

时间:2016-10-03 23:17:43

标签: arrays bash variables

我想要一个脚本bash / sh / ksh 比较很多变量 也许在阵列中,并告诉我是否变量 是空的。 我认为这样的事情......但是没有用。

ARRAY=(
bash="yes"
cash=""
trash="no"
empty=""
)

for var in "${ARRAY[@]}"; do
if [ "$var" == "$empty" ]
then
echo "$var is empty"
else
echo "$var is not empty"
fi
done

我想要一个像这样的输出

bash is not empty
cash is empty...

2 个答案:

答案 0 :(得分:2)

如果您愿意将运行时环境限制为最新版本的bash(或修改代码以支持ksh93的等效语法),

#!/bin/bash
#      ^^^^ -- specifically, bash 4.0 or newer

declare -A array # associative arrays need to be declared!
array=( [bash]="yes" [cash]="" [trash]="no" [empty]="" )

for idx in "${!array[@]}"; do
  if [[ ${array[$idx]} ]]; then
    echo "$idx is not empty"
  else
    echo "$idx is empty"
  fi
done

要迭代数组中的 keys ,而不是 values ,语法为"${!array[@]}",而不是"${array[@]}";如果只是迭代值,则不知道当前正在评估的名称。

或者,假设我们根本不会使用数组;为您打算以类似方式处理的变量设置命名空间的另一种方法是为它们添加前缀:

#!/bin/bash

val_bash=yes
val_cash=
val_trash=no
val_empty=

for var in "${!val_@}"; do
  if [[ ${!var} ]]; then
    echo "${var#val_} is not empty"
  else
    echo "${var#val_} is empty"
  fi
done

这适用于(在bash 3.x上),因为"${!prefix@}"扩展到以prefix开头的变量名列表,"${!varname}"扩展为名称变量的内容它本身存储在变量varname

答案 1 :(得分:1)

迭代数组元素,并在read set IFS的循环内部作为=获取变量,并将其值放在两个单独的变量中,然后检查该值是否为空:

for i in "${array[@]}"; do 
    IFS== read var value <<<"$i"
    if [ -z "$value" ]; then
        echo "$var is empty"
    else
        echo "$var is not empty"
    fi
done

<强>输出:

bash is not empty
cash is empty
trash is not empty
empty is empty