linux 如何在bash中测试数组元素是否都相等?

7ivaypg9  于 2023-06-29  发布在  Linux
关注(0)|答案(1)|浏览(159)

我写了一个脚本,检查wheel组的用户是否在允许用户列表中,如果true,则将值0写入列表result,如果false,则1。然后我发现了一段代码,可以检查结果列表中的所有值是否相同。我的问题是,当列表中没有用户时,他们都得到1,这使得测试通过,而它应该失败
我需要什么?帮助进行代码审查,以使测试适用于以下情况:
result=(所有成员均为0)测试通过
结果=(至少一个成员有1)测试失败
结果=(所有成员均为1)测试失败

#!/bin/bash
source ./colorama.conf

message="verify group wheel members"
wheel_members_list=(
    "username_01"
    "username_02"
    "username_03"
    )
#echo ${wheel_members_list[@]}

output=`getent group wheel | awk -F: '{print $4}' | tr , '\n'`
#echo $output

result=()

for username in $output;do
    if [[ ${wheel_members_list[@]} =~ (^|[[:space:]])$username($|[[:space:]]) ]];then
        result+=(0)
    else
        result+=(1)
    fi
done

echo state: ${result[@]}

if [ "${#result[@]}" -gt 0 ] && [ $(printf "%s\000" "${result[@]}" | 
       LC_ALL=C sort -z -u |
       grep -z -c .) -eq 1 ] ; then
    echo pass
    exit 0
else
  echo fail
  exit 1
fi

编辑:目前我用if条件解决了它,但我会感谢第一个版本的帮助

for state in ${result[@]}; do
    if [ $state -eq 1 ]; then
        exit 1
    fi
done
exit 0
zbq4xfa0

zbq4xfa01#

因为result是一个只有0和1的数组,你可以通过使用纯bash来最有效地做到这一点:

if [[ "${result[*]}" =~ 1 ]]; then
    echo fail
else
    echo pass
fi

这种方式效率较低,但更符合你的尝试,你只需要使用grep在没有找到匹配时失败的事实:

if printf "%s\0" "${result[@]}" |  grep -zq 1; then
    echo fail
else
    echo pass
fi

相关问题