繁体   English   中英

如何在Bash中使用awk命令比较负值?

[英]How to compare negative values with awk command in Bash?

#!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

谢谢

您不能通过在awk使用$variable_name来简单地使用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"}}'

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

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

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

您只需要反转单引号和双引号,以便扩展变量时外壳使用双引号。 也就是说,代替

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

采用

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

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

不需要做任何额外的数值计算的外壳,只是让AWK设置适当的退出状态,并用一个简单的外壳进行测试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

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM