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
相关产品推荐
相关产品推荐

