#!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
感谢
#!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
感谢
使用只是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
如何处理浮动号码? –
非常感谢klashxx –
你不能简单地通过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"}}'
非常感谢。 –
@BomBam,你的欢迎,看到这个https://stackoverflow.com/help/someone-answers – RavinderSingh13
实际上,你可以在'awk'单线程中连接shell变量 - 只要你设置引号是正确的(比较数字 - 不是字符串)。 '-v'更可取,因为它更具可读性,而且他会使用它,他可能不会遇到第一个问题。 – sborsky
下面是一个使用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
然而,传递值到适当的awk
变量与-v
选项仍然是一个更好的主意。
不需要做壳任何额外的数值计算,只是让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
就这么简单。 ++ – batMan
为什么使用'Awk'时,您可以使用算术运算符本身?'if((d1> = d2));那么' – Inian
因为我还需要比较浮动号码。 –
您应该将该信息添加到问题 – klashxx