Linux变量本质是字符串,校验数字需按需选择方法:非负整数用[[ $var =~ ^[0-9]+$ ]],带符号整数用[[ $var =~ ^[+-]?[0-9]+$ ]],小数或科学计数法宜用bc或awk解析。

Linux 中没有“数字类型”变量,所有变量值本质是字符串。所谓“校验是否全为数字”,实际是判断该字符串是否符合纯整数(不含小数点、符号、空格等)的文本格式。关键在于明确需求:只要非负整数?是否允许开头带正负号?是否要支持小数?不同场景对应不同方法。
只接受非负整数(如 0、123、999)
最常用且安全的方式是使用 双中括号 + 正则:
-
[[ $var =~ ^[0-9]+$ ]]—— 必须从头到尾全是数字,至少一位 - 必须写
^和$,否则"abc123"也会匹配成功 - 空字符串
""、"-5"、"3.14"、" 42 "均不通过
接受带符号整数(如 -42、+7、0)
扩展正则即可覆盖常见写法:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
[[ $var =~ ^[+-]?[0-9]+$ ]]—— 允许开头一个可选的+或- - 若只允许负号(禁止
+123),改用^-?[0-9]+$ - 仍不支持小数点或科学计数法,
"2.5"或"1e3"会失败
需要支持小数或更严格语义校验
正则难以可靠覆盖所有合法浮点格式(如 ".5、-.0e+2),推荐用工具做数值解析:
-
echo "$var" | bc -l >/dev/null 2>&1——bc能识别标准浮点和科学计数法,失败即非数字 -
awk -v n="$var" 'BEGIN{exit !(n==n && n!="")}' >/dev/null—— 利用 awk 类型转换:非数字或空串时n==n为假
避免使用的危险方式
以下方法看似简单,但容易误判或引发错误:
-
expr "$var" + 0 &>/dev/null:会把"0123"(八进制)、" 42 "(含空格)、甚至"1+1"都当成有效数字 -
(( var == var )):变量为空或非法时直接报错,需额外捕获$?,且不支持小数 -
sed 's/[0-9]//g'或grep '[^0-9]':无法识别"1..2"、"e10"等非法格式,漏检风险高

















