我正在使用此命令
num1=2.2
num2=4.5
result=$(awk 'BEGIN{print ($num2>$num1)?1:0}')
这总是返回0.无论是num2> numl还是num1> num2 但是当我把实际数字作为这样的时候
result=$(awk 'BEGIN{print (4.5>2.2)?1:0}')
我的返回值为1.这是正确的。
我可以做些什么来完成这项工作?
答案 0 :(得分:1)
由于$num1
和$num2
未通过bash扩展 - 您使用的是单引号。不过,以下内容可行:
result=$(awk "BEGIN{print ($num2>$num1)?1:0}")
但请注意,正如评论中指出的那样,编码风格很差,混合使用bash和awk。就个人而言,我不介意这样的结构;但总的来说,特别是对于复杂的事情,如果你不记得在双引号时用bash评估什么内容,请转到这个问题的其他答案。
请参阅以下评论中@EdMorton的优秀示例。
编辑:实际上,我会使用bc
:
$num1=2.2
$num2=4.5
result=$( echo "$num2 > $num1" | bc )
为什么呢?因为它更清晰......更轻松。
或者使用Perl(因为它更短,因为我更喜欢Perl而不是awk因为我喜欢反引号而不是$()
:
result=`perl -e "print ( $num2 > $num1 ) ? 1 : 0;"`
或者,是想要(并且可能效率低下):
if [ `echo -e "$num1\n$num2" | sort -n | head -1` != "$num1" ] ; then result=0 ; else result=1 ; fi
(是的,我知道)
在史前时期,我有一次短暂的,密集的,长达3年的暴露。现在bash无处不在,可以做大量的东西(我当时只有sh / csh)所以经常可以使用它而不是awk,而计算机足够快,Perl可以用在ad hoc命令行而不是awk。只是说'。
答案 1 :(得分:1)
尝试这样做:
result=$(awk -v num1=2.2 -v num2=4.5 'BEGIN{print (num2 > num1) ? 1 : 0}')
见:
man awk | less +/'^ *-v'
答案 2 :(得分:1)
使用变量时失败的原因是因为单引号括起的awk
脚本由awk
评估而不是bash
:所以如果你想传递变量你正在使用bash
到awk
,您必须使用-v
选项指定它,如下所示:
num1=2.2
num2=4.5
result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')
注意 awk
脚本中使用的程序变量不得以$
为前缀
答案 3 :(得分:0)
这可能对您有用:
result=$(awk 'BEGIN{print ('$num2'>'$num1')?1:0}')
将'
视为通过awk
命令向潜在的bash
shell戳穿洞。