如何在Bourne Shell脚本中校验所有输入参数是否为整数?
解决Bourne Shell脚本的整数输入校验问题
你现在的校验逻辑有几个关键问题,导致没法正确识别非整数输入,咱们一步步来修正它:
现有代码的问题
- 逻辑完全颠倒:你写的
if [ $i -ge 0 ]是判断参数是否为非负整数,当判断成功时(也就是输入是正整数),你反而输出错误并退出,这和需求完全相反。 - 不支持负整数:如果输入
-3这类负整数,[ $i -ge 0 ]会返回false,会被误判为非整数。 - 错误处理不当:当输入非数字时,
[ $i -ge 0 ]会产生错误,但你把错误输出重定向到了/dev/null,导致脚本无法捕捉到这个错误,反而跳过校验执行后续代码。
修正后的解决方案
这里提供两种可靠的校验方式,都支持正负整数的判断:
方法1:使用正则表达式(兼容性好,直观)
通过正则匹配确保输入完全是整数格式,适合所有Bourne Shell环境:
# 先处理无输入的情况 if [ $# -eq 0 ]; then echo "Error: No input provided." >&2 exit 1 fi # 遍历每个输入参数进行校验 for i in "$@"; do # 正则规则:开头可选负号,后面跟一个或多个数字,直到结尾 if ! echo "$i" | grep -qE '^-?[0-9]+$'; then echo "Invalid input: '$i' is not an integer. Please enter only integers." >&2 exit 1 fi done # 校验通过后执行你的业务逻辑 echo "All inputs are valid integers." # ... 后续代码 ...
方法2:利用数值判断的错误返回
利用Shell中test命令对非数值参数会报错的特性,通过捕捉错误返回值来判断:
# 无输入校验 if [ $# -eq 0 ]; then echo "Error: No input provided." >&2 exit 1 fi for i in "$@"; do # 如果$i是整数,$i -eq $i会返回true;非整数则会报错并返回非0值 if ! [ "$i" -eq "$i" ] 2>/dev/null; then echo "Invalid input: '$i' is not an integer." >&2 exit 1 fi done # 后续业务代码 echo "All inputs are valid integers."
关键说明
- 两种方法都会在遇到第一个非整数输入时立即退出并输出错误提示,符合你的需求。
- 正则表达式的方法更直观,能明确控制整数的格式;数值判断的方法更简洁,但依赖Shell对数值运算的错误处理。
内容的提问来源于stack exchange,提问作者MandyLB
相关产品推荐
相关产品推荐

