如何在Bash脚本中验证除首参数外的其余参数是否为数字?
修正Shell脚本的数字校验与排序功能
原代码存在的问题
- 数字校验循环无效:
for i in后未指定遍历对象,循环根本不会执行;同时n=${@:2}将所有后续参数拼接为单个字符串,正则匹配无法逐个检查参数是否为数字。 - 排序逻辑错误:
for i默认遍历所有参数(包括第一个排序选项),导致选项被错误加入排序流程。 - 缺少参数合法性前置检查:未处理未提供数字参数的边界情况。
修正后的代码
#!/bin/bash option=$1 # 检查是否提供了排序方式及至少一个数字参数 if [ $# -lt 2 ]; then echo "请提供排序方式及至少一个数字参数" exit 1 fi # 逐个验证后续参数是否为正整数 valid=true for num in "${@:2}"; do if ! [[ "$num" =~ ^[0-9]+$ ]]; then echo "not a number" valid=false fi done # 根据排序选项执行对应逻辑 case $option in incr) if $valid; then # 输出所有数字参数并升序排序 printf "%s\n" "${@:2}" | sort -n else # 参数无效时输出排序选项 echo "$option" fi ;; dec) if $valid; then # 输出所有数字参数并降序排序 printf "%s\n" "${@:2}" | sort -nr else echo "$option" fi ;; *) echo "Invalid option" ;; esac
关键修正说明
- 数字校验逻辑:通过
for num in "${@:2}"逐个遍历所有后续参数,使用正则^[0-9]+$检查是否为正整数,检测到非数字时输出提示并标记参数无效。 - 排序逻辑优化:用
printf "%s\n" "${@:2}"直接输出所有数字参数,避免冗余循环,同时确保仅处理排序选项以外的参数。 - 边界处理:增加参数数量检查,当未提供数字参数时给出明确提示并退出。
- 错误分支处理:当存在非数字参数时,按预期输出排序选项;参数全部有效时执行对应排序。
测试验证
- 错误输入测试:
./ex_4.sh incr utdu
输出:not a number incr - 正确输入测试:
./ex_4.sh dec 4 5 6 0
输出:6 5 4 0
内容的提问来源于stack exchange,提问作者Lian
相关产品推荐
相关产品推荐

