Bash脚本ACL段逻辑疑问:变量长度判断与退出逻辑
关于Bash脚本ACL功能段的问题解答
问题1:已通过命令获取ACL变量值,是否仍需保留read $ACL语句?
不需要,而且必须删掉这条语句。理由如下:
read命令的正确用法是read 变量名,用于从标准输入读取内容赋值给指定变量。而你的代码里写read $ACL,是把变量ACL当前的值当作要赋值的变量名,试图从标准输入读取内容覆盖那个变量,完全不符合需求。- 你已经通过
ACL=$(cat ${FILTERINPUTFILE} | grep ... | awk ...)(建议把反引号换成$(),可读性更好)获取了ACL的正确值,这条read语句会破坏原有值,导致后续逻辑基于错误的变量值执行。
问题2:当前代码中长度判断与执行逻辑的问题
原代码存在语法和逻辑缺陷,无法实现预期效果,具体分析和修正如下:
原代码的核心问题:
- 缩进与语法错误:
else块内的if语句缩进混乱,导致代码结构逻辑分支错误。 read $ACL破坏变量值:如问题1所述,这条语句会覆盖你原本获取的ACL值,导致后续长度判断完全失效。break的误用:如果这段代码不在for/while循环内部,break命令会直接报错并终止脚本,而非“跳出if/then语句进入后续逻辑”。
修正后可实现预期行为:
删掉read $ACL并修正语法后,代码可以满足你的需求:
ACL=$(cat "${FILTERINPUTFILE}" | grep "${ORGMH}-0xd70006_AlarmCauseList: " | awk '{print substr($0, 35)}') if [[ $ACL == "ZZZ" ]]; then echo "Alarm Cause List was not present for this filter: ${FNAME}" else if [ ${#ACL} -gt 2048 ]; then echo "ACL is longer than the maximum 2048 character limit" # 若这段代码在循环内,用break跳出循环;不在循环内无需break,执行完echo后自动进入后续逻辑 # break # 仅循环场景下需要 else "${CLIPATH}/update" mh="${FMHANDLE}" attr=0xd70006,val="${ACL}" fi fi
- 当
ACL长度大于2048:执行echo提示后,会自动退出当前if分支,进入脚本后续逻辑(循环场景下用break跳出循环)。 - 当
ACL长度≤2048:会正常执行${CLIPATH}/update命令,将ACL值传入。
内容的提问来源于stack exchange,提问作者DanL
相关产品推荐
相关产品推荐

