2

我正在使用这个命令

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。这是正确的。

我能做些什么来完成这项工作?

4

4 回答 4

1

因为$num1and$num2没有被 bash 扩展——你使用的是单引号。但是,以下将起作用:

result=$(awk "BEGIN{print ($num2>$num1)?1:0}")

但是请注意,正如评论中指出的那样,这是一种糟糕的编码风格,并且混合了 bash 和 awk。就个人而言,我不介意这样的结构。但总的来说,尤其是对于复杂的事情,如果你不记得在双引号中 bash 会评估什么事情,请转向这个问题的其他答案。

请参阅下面评论中@EdMorton 的出色示例。

编辑:实际上,我会使用 awk 而不是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 年地接触过 awk。如今 bash 无处不在,可以做很多事情(当时我只有 sh/csh),所以它经常可以用来代替 awk,而计算机的速度足以让 Perl 用于临时命令行而不是 awk。只是在说'。

于 2012-11-20T18:59:52.723 回答
1

尝试这样做:

result=$(awk -v num1=2.2 -v num2=4.5 'BEGIN{print (num2 > num1) ? 1 : 0}')

看 :

man awk | less +/'^ *-v'
于 2012-11-20T19:02:38.107 回答
1

使用变量时失败的原因是awk单引号括起来的脚本是由awk而不是评估的bash:所以如果你想传递你正在使用的变量 from bashto awk,你必须使用-v如下选项指定它:

num1=2.2
num2=4.5

result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')

请注意,脚本 中使用的程序变量awk不得以$

于 2012-11-20T19:05:42.257 回答
0

这可能对您有用:

result=$(awk 'BEGIN{print ('$num2'>'$num1')?1:0}')

把's 想象成通过命令向底层shell'戳洞。awkbash

于 2012-11-21T00:38:18.703 回答