2017-10-17 163 views
0
#!bin/bash 

d1=-7 
d2=-2 

if (($(awk 'BEGIN {print ("'$d1'" >= "'$d2'")}'))); then 
    echo "yes" 
    echo "$d1 >= $d2" 
else 
    echo "no" 
fi 

我为什么得到?如何在Bash中使用awk命令比较负值?

yes 
-7 >= -2 

感谢

+3

为什么使用'Awk'时,您可以使用算术运算符本身?'if((d1> = d2));那么' – Inian

+0

因为我还需要比较浮动号码。 –

+2

您应该将该信息添加到问题 – klashxx

回答

0

使用只是bash

#!/usr/bin/bash 

d1=-7 
d2=-2 

if ((d1 >= d2)); then 
    echo "yes" 
else 
    echo "no" 
fi 

对于浮动:

#!/usr/bin/bash 

d1=-7.6 
d2=-2.3 

if [ "$(echo ${d1}'>='${d2} | bc -l)" = "1" ]; then 
    echo "yes" 
else 
    echo "no" 
fi 
+0

如何处理浮动号码? –

+0

非常感谢klashxx –

1

你不能简单地通过awk使用$variable_name使用shell变量。你应该初始化一个变量awk,例如 - >-v var="$shell_variable"然后你可以使用shell变量的值在awk代码中。尝试以下awk

awk -v d1="$d1" -v d2="$d2" 'BEGIN{if(d1>=d2){print "yes";} else {print "no"}}' 
+1

非常感谢。 –

+0

@BomBam,你的欢迎,看到这个https://stackoverflow.com/help/someone-answers – RavinderSingh13

+0

实际上,你可以在'awk'单线程中连接shell变量 - 只要你设置引号是正确的(比较数字 - 不是字符串)。 '-v'更可取,因为它更具可读性,而且他会使用它,他可能不会遇到第一个问题。 – sborsky

1

下面是一个使用bc -l比较浮点数较短的命令:

[[ $(bc -l <<< "$d1 >= $d2") -eq 1 ]] && echo "yes" || echo "no" 
+1

这是可爱的方法 –

1

双引号引起awk执行字符串比较,并-7字典序大于-2 ,因为72之后。

您只需反转单引号和双引号,以便在扩展变量时使用双引号。也就是说,不是

if (($(awk 'BEGIN {print ("'$d1'" >= "'$d2'")}'))); then 

使用

if (($(awk 'BEGIN {print ('"$d1"' >= '"$d2"')}'))); then 

然而,传递值到适当的awk变量与-v选项仍然是一个更好的主意。

1

不需要做壳任何额外的数值计算,只是让AWK设置适当的退出状态,并用一个简单的shell if测试:

$ cat tst.sh 
d1=$1 
d2=$2 

if $(awk -v d1="$d1" -v d2="$d2" 'BEGIN{exit (d1 >= d2 ? 0 : 1)}'); then 
    echo "yes" 
    echo "$d1 >= $d2" 
else 
    echo "no" 
fi 

$ ./tst.sh -0.5 -0.409 
no 

$ ./tst.sh -0.5 -0.500 
yes 
-0.5 >= -0.500 

$ ./tst.sh -0.5 -0.501 
yes 
-0.5 >= -0.501 
+1

就这么简单。 ++ – batMan