このコマンドを使用しています
num1=2.2
num2=4.5
result=$(awk 'BEGIN{print ($num2>$num1)?1:0}')
これは常に 0 を返します。
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 を返します。
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 を使用する (より短いため、私は awk よりも Perl が好きであり、バッククォートよりも好きだから$()
:
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
(はい、知っています)
私は先史時代に awk に短期間、集中的に 3 年間さらされました。最近では bash はどこにでもあり、多くのことを実行できます (当時は sh/csh しかありませんでした)。そのため、awk の代わりに使用できることがよくありますが、コンピューターは awk の代わりにアドホック コマンド ラインで Perl を使用するのに十分高速です。言ってるだけ'。
変数を使用すると失敗する理由はawk
、一重引用符で囲まれたスクリプトがawk
and ではなくによって評価されるためです。したがって、使用している変数を fromに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
スクリプト 内で使用されるプログラム変数には、接頭辞を付けないでください。$
これはあなたのために働くかもしれません:
result=$(awk 'BEGIN{print ('$num2'>'$num1')?1:0}')
は、コマンドを介して下層のシェルに'
穴を開けるようなものと考えてください。awk
bash