[英]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
,因为7
在2
之后。
您只需要反转单引号和双引号,以便扩展变量时外壳使用双引号。 也就是说,代替
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.