如何在Bash脚本中合并条件判断,避免重复书写-le 100
如何简化Bash脚本中重复的成绩范围判断?
我来帮你解决这个重复写判断条件的问题,这里有两种实用的方案可以避免每次都输入-le 100:
方案一:使用数组遍历判断(推荐,扩展性更强)
把输入的所有成绩存入数组,然后通过循环遍历数组中的每个元素进行校验,这样不管是5门课还是更多课程,都不用修改判断逻辑的结构:
while true do echo "enter marks of 5 subjects" read -a marks # 将输入的成绩批量读入数组marks local valid=true # 遍历数组中的每一个成绩 for mark in "${marks[@]}" do # 只要有一个成绩超过100,就标记为无效并跳出循环 if ! [ "$mark" -le 100 ] then valid=false break fi done if "$valid" then # 如果需要单独使用单门课成绩,可以通过索引获取:m1=${marks[0]}, m2=${marks[1]}... break else echo "marks cannot be more than 100" fi done
这种方式的优势很明显:如果之后需要增加课程数量,只需要修改提示文本,判断逻辑完全不用动,非常灵活。
方案二:封装判断逻辑到函数中
如果不想改变原有变量的结构,可以把成绩校验的逻辑封装成一个函数,每次调用函数来完成判断,这样后续要修改校验规则(比如改成不能超过90),只需要修改函数内部即可:
# 定义一个校验成绩的函数,参数是单个成绩 is_valid_mark() { local input_mark="$1" [ "$input_mark" -le 100 ] } while true do echo "enter marks of 5 subjects" read m1 m2 m3 m4 m5 if is_valid_mark "$m1" && is_valid_mark "$m2" && is_valid_mark "$m3" && is_valid_mark "$m4" && is_valid_mark "$m5" then break else echo "marks cannot be more than 100" fi done
这个方案更贴合你原有脚本的变量结构,只是把重复的判断逻辑抽离到了函数里,可读性和维护性都有所提升。
内容的提问来源于stack exchange,提问作者Manik
相关产品推荐
相关产品推荐

