2016-10-03 80 views
1

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

如果你运行'声明-p ARRAY',你会得到像'声明-a ARRAY =“([0] = ”庆典= YES“[1] = ”现金=“ 结果[2 ] =“垃圾=否”[3] =“空=”)“',表明你的密钥是当前的tly'0','1','2'和'3',与'bash','cash','trash'和'empty'的推测值相比。 –

回答

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 

遍历在阵列中,而不是,语法是"${!array[@]}",而不是"${array[@]}";如果您只是遍历这些值,则不知道当前正在评估的名称。


或者,假设我们不打算使用数组;另一种方式来设置一个命名空间变量,你打算能够以类似的方式对待是前缀来:

#!/bin/bash 

val_bash=yes 
val_cash= 
val_trash=no 
val_empty= 

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

此作品(巴蜀3.x的为好),因为"${[email protected]}"扩展到变量列表以prefix"${!varname}"开头的名称扩展为变量的内容,其名称本身存储在变量varname中。

+0

也许你应该包括一个shebang行,因为问题提到“bash/sh/ksh”。 – choroba

+0

@choroba,好电话,修改。 –

1

遍历阵列元件,和在循环内对read设置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 
+0

如果OP的数据结构确实是不可变的,并且意图完全符合问题中的内容,那么这当然是正确的。但我不确定情况如何 - 他们谈论的是愿意接受任何sh/ksh/bash解决方案,所以肯定他们在语法上很灵活。如果目标是选择一种适合作业的正确工具语法,那么我认为关联数组是唯一明智的选择:谁想要遍历数字索引数组以找到他们想要的变量? –

+0

@CharlesDuffy我第二。关联数组是这里的_right_数据结构。 – heemayl