如何在Bash中将负值与awk命令进行比较?

时间:2017-10-17 09:38:18

标签: linux bash awk

#!bin/bash

d1=-7
d2=-2

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

为什么我得到了?

yes
-7 >= -2

感谢

5 个答案:

答案 0 :(得分:1)

您不能在$variable_name中使用awk来简单地使用shell变量。您应初始化awk变量,例如 - > -v var="$shell_variable"然后您可以在awk代码中使用shell变量的值。请尝试关注awk

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

双引号导致awk执行字符串比较,而-7 词典编纂大于-2,因为7位于2之后1}}。

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

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

使用

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

但是,使用awk选项将值传递到正确的-v变量仍然是一个更好的主意。

答案 3 :(得分:1)

不需要在shell中进行任何额外的数值计算,只需让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

答案 4 :(得分: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