Bash中判断两数符号是否相同的语句报错,如何修复?
Bash脚本符号判断错误修复及除法输出优化
问题原因分析
你写的if [[ $($a > 0) -eq $($b > 0) ]]会报错是因为$($a > 0)的写法完全错误:Bash会把$a的值当作命令去执行(比如a=3时,会尝试运行3 > 0这个不存在的命令),自然会报"command not found"。Bash里的数值比较不能这么写,得用正确的条件判断语法。
另外,脚本里的if [[ $a/$b -eq 0 ]]也有问题:$a/$b是字符串(比如"3/5"),不能直接用-eq做数值比较,需要通过bc来计算后判断。
修复方案
1. 正确判断两数符号是否相同
判断两个数同号有两种简洁方式:
- 利用乘法符号规则:同号相乘为正,异号为负,用
(( a * b > 0 ))判断 - 直接判断符号组合:
(( (a > 0 && b > 0) || (a < 0 && b < 0) ))
2. 修复除法结果是否为0的判断
用bc计算除法的整数部分,判断是否为0:[ $(echo "scale=0; $a/$b" | bc) -eq 0 ]
3. 调整除法输出逻辑
当结果整数部分为0时,统一处理前置0:同号输出0.xx,异号输出-0.xx,避免出现0.-60的错误格式。
完整修复后的脚本
#!/bin/bash a=$1 b=$2 # 加减乘运算 echo $((a + b)) echo $((a - b)) echo $((a * b)) # 除法运算处理 if [[ $b -eq 0 ]]; then echo "#" else # 判断除法结果的整数部分是否为0 div_int=$(echo "scale=0; $a/$b" | bc) if [[ $div_int -eq 0 ]]; then # 判断两数是否同号 if (( a * b > 0 )); then # 同号:输出0.xx echo "scale=2; 0 + $a/$b" | bc -l | sed 's/^\./0./' else # 异号:输出-0.xx echo "scale=2; 0 + (-$a/$b)" | bc -l | sed 's/^\./-0./' fi else # 整数部分非0,直接输出保留两位小数的结果 echo "scale=2; $a/$b" | bc -l fi fi
说明
- 用
sed 's/^\./0./'和sed 's/^\./-0./'可以更简洁地处理前置0的问题,避免复杂的条件判断拼接字符串 0 + $a/$b是为了让bc输出时如果是小数开头(比如.60)能被sed捕获替换- 符号判断用
(( a * b > 0 ))最简洁高效,避免多条件嵌套
内容的提问来源于stack exchange,提问作者warmike_1
相关产品推荐
相关产品推荐

