首页 > 解决方案 > 遍历数组以在 Bash 中搜索多个元素

问题描述

firstvar="PRIMARY"
secondvar="SECONDARY"
thirdvar="TERTIARY"

array=($firstvar $secondvar $thirdvar)
echo ${array[*]} //prints PRIMARY SECONDARY TERTIARY

我想在我的 bash 脚本中迭代这个数组,并检查 3 个元素(PRIMARY SECONDARY TERTIARY)是否存在于数组中,并且没有特定的顺序。如果是,echo "Success.如果不是,echo Failed。什么是解决这个问题的好方法?

编辑: 我忘了提到如果数组中缺少一个元素(例如 PRIMARY),它也应该打印出Primary is missing. 对于类似的数组:

array_health=($firsthealth $secondhealth $thirdhealth)

这 3 个变量可以有 1 或其他我想检查数组中的这 3 个变量是否有 value=1,我将如何检查?它们未初始化为firsthealth=0or firsthealth=1

标签: linuxbashshell

解决方案


您可以一个一个地遍历元素:

flag=0
for ele in "$firstvar" "$secondvar" "$thirdvar"; do
    if [[ ! " ${array[@]} " =~ " ${ele} " ]]; then
        echo "$ele" is missing
        flag=1
    fi  
done    


if [[ flag -eq 0 ]]; then 
    echo "all there"
fi

如果您的元素可能有空格,那将使上面的测试不可靠。您可以使用不同的分隔符,printf将左右分隔符添加到字符串中不太可能出现的字符:

firstvar="PRIMARY SECONDARY"
secondvar="SECONDARY"
thirdvar="TERTIARY"

array=("$firstvar" "$thirdvar")

flag=0
printf -v tgt "|%s|" "${array[@]}"  # |ele1||ele2||eleN|
for ele in "$firstvar" "$secondvar" "$thirdvar"; do
    if [[ ! "$tgt" =~ "|${ele}|" ]]; then
        echo "$ele" is missing
        flag=1
    fi  
done    

if [[ flag -eq 0 ]]; then 
    echo "all there"
fi

印刷SECONDARY is missing


推荐阅读