如何在Bash中检查输入数量是否超过5个?实现输入数量限制功能
解决Bash脚本中输入数量检查及分数验证的问题
我来帮你完善这个脚本,既实现输入数量不超过5个的检查,又保留原有的分数不超过100的验证逻辑,还顺便解决了原脚本可能遇到的非数字输入报错问题~
修改后的完整脚本
while true do echo "enter marks of up to 5 subjects (space-separated)" # 将所有输入读取到数组中,方便统计输入数量和后续遍历验证 read -a marks # 第一步:检查输入数量是否超过5个 if [ ${#marks[@]} -gt 5 ]; then echo "you have entered more than 5 inputs" continue # 跳过后续检查,重新要求输入 fi # 第二步:验证每个分数是否合法(不超过100,且是数字) is_valid=true for mark in "${marks[@]}"; do # 先检查输入是否为正整数,避免非数字导致脚本报错 if ! [[ "$mark" =~ ^[0-9]+$ ]]; then echo "invalid input: please enter only numeric marks" is_valid=false break fi # 检查分数是否超过100 if [ "$mark" -gt 100 ]; then echo "marks cannot be more than 100" is_valid=false break fi done # 如果所有验证都通过,退出循环 if [ "$is_valid" = true ]; then # 可选:将数组内容赋值回原变量m1-m5(如果后续逻辑需要) m1=${marks[0]:-0} m2=${marks[1]:-0} m3=${marks[2]:-0} m4=${marks[3]:-0} m5=${marks[4]:-0} break fi done # 示例:输出最终输入的分数 echo "Valid marks entered: ${marks[*]}"
关键改进说明
- 输入数量检查:用
read -a marks把所有空格分隔的输入存入数组,通过${#marks[@]}获取数组元素个数,能准确判断是否超过5个输入。原脚本中如果输入超过5个,最后一个变量会接收剩余所有内容,既无法正确统计数量,还会导致后续数字验证报错。 - 增强的合法性验证:新增了非数字输入的检查(通过正则表达式
^[0-9]+$判断是否为正整数),避免用户输入字母或符号时脚本崩溃。 - 灵活的变量兼容:如果后续逻辑需要使用
m1到m5这些单独变量,脚本里用${marks[N]:-0}的方式赋值,确保即使输入不足5个,变量也有默认值0(你可以根据需求调整默认值)。
内容的提问来源于stack exchange,提问作者Manik
相关产品推荐
相关产品推荐

