我正在使用这个命令
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。这是正确的。
我能做些什么来完成这项工作?
我正在使用这个命令
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。这是正确的。
我能做些什么来完成这项工作?
因为$num1
and$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。只是在说'。
尝试这样做:
result=$(awk -v num1=2.2 -v num2=4.5 'BEGIN{print (num2 > num1) ? 1 : 0}')
看 :
man awk | less +/'^ *-v'
使用变量时失败的原因是awk
单引号括起来的脚本是由awk
而不是评估的bash
:所以如果你想传递你正在使用的变量 from bash
to awk
,你必须使用-v
如下选项指定它:
num1=2.2
num2=4.5
result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')
请注意,脚本 中使用的程序变量awk
不得以$
这可能对您有用:
result=$(awk 'BEGIN{print ('$num2'>'$num1')?1:0}')
把's 想象成通过命令向底层shell'
戳洞。awk
bash