You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本代码审查:修正wheel组成员验证的数组判断逻辑

问题:修正Wheel组成员验证脚本的判断逻辑

我编写了一个Bash脚本,用于验证wheel组的成员是否在允许用户列表中:若成员在列表中,则向result数组写入0;否则写入1。原脚本通过判断result数组所有元素是否相同来决定测试是否通过,但当所有成员都不在允许列表(result全为1)时,测试错误地判定为通过,这不符合需求。

需求要求:

  • 当result所有元素为0时,测试通过
  • 当result中至少有一个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

临时解决代码

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

原脚本的修正方案

原脚本的核心问题是:仅判断了数组元素是否唯一,但未校验这个唯一元素是否为0。以下两种修正方式都可以满足需求:

方式1:直接检查数组中是否存在1(更直观简洁)

替换原脚本最后的判断逻辑为:

echo state: ${result[@]}

# 检查result数组非空且不存在1,说明所有成员都在允许列表中
if [ "${#result[@]}" -gt 0 ] && [[ ! " ${result[@]} " =~ " 1 " ]]; then
    echo pass
    exit 0
else
    echo fail
    exit 1
fi

这种方式直接判断数组里有没有1,只要没有1,就符合通过条件,逻辑清晰易懂。

方式2:基于原逻辑补充校验(保留原脚本的管道风格)

在原判断条件基础上,增加对唯一元素是否为0的校验:

echo state: ${result[@]}

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

这种方式保留了原脚本的元素唯一性判断逻辑,同时新增"${result[0]}" -eq 0的条件,确保唯一的元素是0,避免全1的情况被误判为通过。

内容的提问来源于stack exchange,提问作者Kubix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:30:21