var1 = 6、var2 = 4変数に値を格納し、精度2で割って結果を変数に保存しようとしていますvar
。
var=`awk 'BEGIN {printf "%.2f\n", $var1/ $var2}'`
上記の作業を行うと
awk: cmd. line:1: fatal: division by zero attempted
誰かが私がここで正確に見逃していることを指摘できますか?
ありがとうございます!
答え1
-v var=value
awkに変数を渡すために使用されます。
だから
awk -v var1="$var1" -v var2="$var2" 'BEGIN {printf "%.2f\n",var1/var2}'
与える
1.50
そして
var=$(awk -v var1="$var1" -v var2="$var2" 'BEGIN {printf "%.2f\n",var1/var2}')
値を設定します。
あなたはする必要があります
-v var1="$var1"
bashの$ var1をawkのvar1に変換するvar1
以下で使用awk
(必須ではない$
,$var1
var1=6 が$6
値である)(awkでBEGINを忘れます)echo
入力を提供するawk
(そうでなければ、awkは入力を待って中断されます)
答え2
$var1
ここでとの内容を渡すことができます。$var2
シェルawk
変数をスクリプトのパラメータとして使用し、特殊な配列変数を介してスクリプトからその変数にアクセスしますARGV
。
var=$(awk -- 'BEGIN {printf "%.2f", ARGV[1] / ARGV[2]}' "$var1" "$var")
または、変数をエクスポートしてシェルすることもできvar1
ますvar2
。環境配列変数でawk
検索するには、次の手順を実行します。ENVIRON
var=$(
export var1 var2
awk 'BEGIN {printf "%.2f", ENVIRON["var1"] / ENVIRON["var2"]}'
)
ARGV
一般的な場合は、/ ENVIRON
over-v
または引数を使用して任意のデータを渡すことが一般的ですvar=value
。後者はバックスラッシュ文字を破ることができるからです(もちろん数字には実際には問題にはなりませんが)。
コードパラメータにシェル変数拡張を含めると、awk
コード注入の脆弱性が発生するため、回避する必要があります。以下にも適用されます。パラメータにパラメータ拡張を引用することを忘れました。-v
。
シェルがまたは次の場合、これはksh93
まったく必要ありませんzsh
。awk
printf -v var %.2f '1.*var1 / var2' # zsh
var=${ printf %.2f '1.*var1 / var2'; } # ksh93
(AND を乗算すると、1.
計算は浮動小数点形式で実行されます.)
しかし、あなたが必要であることに注意してください。この変数の内容を整理してください。そうしないと、別のランダムコード実行の脆弱性になります。これらの変数の内容があなたの管理下にない場合。
答え3
これは単純なスクリプトには問題がありますが、実際に使用したい場合はawk
より複雑なスクリプトには適しています。これには2つの方法で解決できます。
単純な引用符を二重引用符に置き換えます。ドルの拡大を防ぐ簡単な方法。これにより、既存の二重引用符をエスケープする必要性などの他の問題が発生し、フィールド
awk
内でフィールドを使用したい場合も同じ要件が発生します。var=`awk "BEGIN {printf \"%.2f\n\", $var1/ $var2}"`
変数を
awk
正しい方法で渡します。var=$(awk -v var1="$var1" var2="$var2" 'BEGIN {printf("%`.2f\n",var1,var2)}')