最可靠的方法是用正则匹配非负整数:[[ $input =~ ^[0-9]+$ ]],确保字符串全为数字且非空;支持符号时用^[-+]?[0-9]+$;避免-eq(八进制误判)、expr(溢出)等陷阱。

直接用正则匹配最可靠,尤其对整数。Shell 的 [[ ]] 内置支持正则,语法简洁、无需额外命令、不依赖外部工具。
只允许非负整数(0, 123, 999)
这是最常见也最安全的校验场景:
- 用
^[0-9]+$匹配:开头到结尾全是数字,至少一位 -
^表示字符串起始,$表示结束,避免 "123abc" 或 "abc123" 被误判 - 空字符串、带空格、含字母或符号都会失败
示例:
if [[ $input =~ ^[0-9]+$ ]]; then echo "是纯数字" else echo "不是纯数字" fi
支持带符号的整数(-123, +45)
若需兼容负号或正号,正则要扩展:
-
^-?[0-9]+$:支持可选负号(-?),但不支持显式+ -
^[-+]?[0-9]+$:同时支持-和+开头 - 注意:
+123在数学上合法,但很多脚本约定只接受无符号或带负号形式
避开常见陷阱的方法
有些看似简单的方式容易出错,需谨慎使用:
-
expr "$input" + 0 &>/dev/null:能工作,但会把-0、+0当作有效整数,且对超大数可能溢出或报错 -
echo "$input" | sed 's/[0-9]//g':需再判断结果是否为空,还要额外处理负号,代码变长且易漏边界 -
[ "$input" -eq "$input" ] 2>/dev/null:看似巧妙,但 shell 会把以0开头的数(如012)解释为八进制,导致误判
小技巧:快速验证命令行输入
写成一行命令,方便调试或临时检查:
read -p "输入: " x; [[ $x =~ ^[0-9]+$ ]] && echo "✓ 纯数字" || echo "✗ 不符合"
输入 42 输出 ✓,输入 42a、-5、" 123" 或空回车都输出 ✗。











