我想要一个脚本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...
答案 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