27

我正在尝试比较两个十进制值,但出现错误。我用了

if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then

正如其他堆栈溢出线程所建议的那样。

我收到错误。

解决这个问题的正确方法是什么?

4

8 回答 8

43

你可以使用 Bash 的数字上下文来做到这一点:

if (( $(echo "$result1 > $result2" | bc -l) )); then

bc将输出 0 或 1,(( ))并将它们分别解释为 false 或 true。

使用 AWK 做同样的事情:

if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
于 2012-06-28T04:50:03.733 回答
8
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y"
then
  echo z not greater than y
else
  echo z greater than y
fi
于 2013-11-11T17:48:50.963 回答
5
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
  echo "$result1 is greater than $result2"
fi
于 2017-10-19T10:01:01.770 回答
4

跟进丹尼斯的回复:

尽管他的回答对于小数点是正确的,但 bash throws (standard_in) 1: syntax error with floating point algorithm。

result1=12
result2=1.27554e-05


if (( $(echo "$result1 > $result2" | bc -l) )); then
    echo "r1 > r2"
else
    echo "r1 < r2"
fi

尽管退出代码为 0,但这会返回带有警告的错误输出。

(standard_in) 1: 语法错误
r1 < r2

虽然对此没有明确的解决方案(讨论线程 1线程 2awk ),但我使用了以下部分修复方法,通过使用后跟使用bc丹尼斯的回复和此线程中的命令来四舍五入浮点结果

四舍五入到所需的小数位:以下将获得以 TB 为单位的递归目录空间,并在小数点后第二位四舍五入。

result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}')

然后,您可以使用上面的 bash 算术或使用以下线程[[ ]]中的附件。

if (( $(echo "$result1 > $result2" | bc -l) )); then
    echo "r1 > r2"
else
    echo "r1 < r2"
fi

或使用输出 1 为而 0 为-eq的运算符bc

if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
    echo "r1 < r2"
else
    echo "r1 > r2"
fi
于 2017-10-17T02:54:31.867 回答
0

对于 shell 脚本,我不能使用双括号 (())。所以,帮助我的是将它分成两行并以经典方式进行比较。

low_limit=4.2
value=3.9
        
result=$(echo "${value}<${low_limit}" | bc)
    
if [ $result = 1 ]; then
  echo too low; 
else 
  echo not too low; 
fi
于 2021-05-04T07:50:11.777 回答
-1

你也可以echo声明if...elsebc

- echo $result1 '>' $result2
+ echo "if (${result1} > ${result2}) 1 else 0"

(
#export IFS=2  # example why quoting is important
result1="2.3" 
result2="1.7" 
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ]; then echo yes; else echo no;fi
if [ "$(echo "if (${result1} > ${result2}) 1 else 0" | bc -l)" -eq 1 ];then echo yes; else echo no; fi
if echo $result1 $result2 | awk '{exit !( $1 > $2)}'; then echo yes; else echo no; fi
)
于 2013-03-18T11:23:36.753 回答
-2

不能 bash 强制类型转换?例如:

($result1 + 0) < ($result2 + 0)
于 2014-07-23T06:37:05.967 回答
-3

为什么使用 bc ?

for i in $(seq -3 0.5 4) ; do echo $i ; if [[ (( "$i" < 2 )) ]] ; then echo "... is < 2";fi; done

唯一的问题:比较“<”不适用于负数:它们被视为绝对值。

于 2014-04-18T19:21:15.470 回答