Bash中如何不修改原变量提取带$金额的整数值用于条件判断
解决方案
你原有代码存在三个问题:
- 仅做了删除小数部分的处理,没有移除开头的
$符号,拿到的是带$的字符串无法直接做数值计算 [[ ]]中使用<执行的是字符串字典序比较,不是数值大小比较,会出现"99" > "1000"这类逻辑错误1000]]前缺少空格,属于shell语法错误,[[ ]]结构的运算符、括号内侧都需要保留空格
不需要修改原变量、不需要多步处理、兼容任意数字位数的写法可以直接用bash原生嵌套参数扩展实现,全程无外部命令依赖:
# 核心取值逻辑:${${p%%.*}#\$} # 第一步${p%%.*}:删除从.开始的所有小数部分,得到$+整数的格式 # 第二步${结果#\$}:删除开头的$符号,得到纯整数字符串 # 用(())做数值比较,避免字符串比较的坑 if (( ${${p%%.*}#\$} < 1000 )); then p="${p}0" fi
效果验证
针对你提到的所有格式场景,取值结果完全符合预期:
- 当
p='$2.2'时,取到的整数值为2 - 当
p='$1234.56'时,取到的整数值为1234 - 当
p='$123456.1234'时,取到的整数值为123456
整个判断流程不会修改原p变量的内容,只有满足条件触发赋值时才会更改变量,后续逻辑依然可以正常读取带$的原始值。
如果需要兼容bash 4.0以下不支持嵌套参数扩展的极老版本,可以用下面的写法,效果完全一致:
if (( 10#${p:1:$(expr index "$p" .)-2} < 1000 )); then p="${p}0" fi
这里${p:1}是跳过开头第一个字符也就是$,再截取到.之前的部分,10#前缀是强制把值按十进制解析,避免前导0被识别成八进制的坑。
内容的提问来源于stack exchange,提问作者DenisZ
相关产品推荐
相关产品推荐

