【问题标题】:bash test for number in range (with float numbers)bash 测试范围内的数字(使用浮点数)
【发布时间】:2012-10-18 10:21:34
【问题描述】:

问题出在这一行

elif [  "$(echo $a '>' $v06 | bc -l)"  -eq 1  &&   "$(echo $a '<' $v08 | bc -l)" -eq 1  ];then

如何测试数字是否在范围内? 我知道可能有其他解决方案,但我想用 bc 以这种方式解决......

a=0.1
v06=0.6
v08=0.8

if [ "$(echo $a '<' $v06 | bc -l)" -eq 1 ];then
    echo " <0.6"
elif [  "$(echo $a '>' $v06 | bc -l)"  -eq 1  &&   "$(echo $a '<' $v08 | bc -l)" -eq 1  ];then
    echo " <0.6 >0.8"
else
    echo ">1.5"
fi

【问题讨论】:

  • 你知道在这种情况下你不会遇到 elif 吗? 0.1 小于 0.6,您正在测试 $a 是否介于 0.6 和 0.8 之间。我已经用 0.7 对其进行了测试,然后 elif 中的测试确实有效。

标签: linux bash shell


【解决方案1】:

实际上,唯一的错误是您在 [ ] 中使用了 &amp;&amp;,这不起作用。

对于多个测试条件,只有[[ ]] 可以包含&amp;&amp;

你可以把&amp;&amp;放在外面,像这样

elif [ "$(echo $a '>' $v06 | bc -l)" -eq 1 ] && [ "$(echo $a '<' $v08 | bc -l)" -eq 1 ]; then 

更好

elif [ $(echo "($a > $v06) && ($a < $v08)" | bc -l) -eq 1 ]; then

因为bc 实际上支持(num1 &gt; num2) &amp;&amp; (num1 &lt; num3) 表示法

p/s:您不需要 $( ) 周围的引号,因为您只期望 01 作为返回值

p/s2:您可以在 $( ) 中使用引号,即使它包含在引号中,例如

"$(echo "1 + 2" | bc -l )" 

【讨论】:

    【解决方案2】:

    你可以去掉“0”。并使用 -gt 和 -lt 运算符:

    v06="$(echo $v06 | sed 's/0.//')"
    v08="$(echo $v08 | sed 's/0.//')"
    
    
    
    
    elif [  $a -gt $v06 -a $a -lt $v08 ];then
    

    【讨论】:

    • 第 43 行:[: .6: 需要整数表达式
    【解决方案3】:

    如果你真的想使用 bc:

    test1=$(bc -l <<< "${a} < ${v06}")
    test2=$(bc -l <<< "${a} > ${v06}")
    test3=$(bc -l <<< "${a} < ${v08}")
    if [[ ${test1} -eq 1 ]]; then
       blabla
    elif [[ ${test1} -eq 1 && ${test2} -eq 1 ]]; then 
       blabla
    fi
    

    我建议在变量周围使用大括号(这样您就可以确定 06 和 08 不会附加到 $v),如果您使用像 &amp;&amp; 这样的运算符,请在测试中使用双括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      相关资源
      最近更新 更多