回答:
それは実際にはPOSIXにありますawk
(POSIX 2008へのリンク、以前のバージョンにもそれがあったと私は信じています)。オプションセクションで-v
説明されていますが、もう1つの方法はオペランドセクションです。
-v
ファイル名の最後の割り当てには、次のような違いがあります。
-v
:アプリケーションは、割り当て引数が割り当てオペランドと同じ形式であることを確認する必要があります。指定された変数の割り当ては、BEGINパターン(存在する場合)に関連付けられたアクションを含め、awkプログラムの実行前に行われます。このオプションは複数指定できます。
[...]そのような変数の割り当てはそれぞれ、次のファイル(ある場合)の処理の直前に行われます。したがって、最初のファイル引数の前の代入は、BEGINアクション(存在する場合)の後に実行され、最後のファイル引数の後の代入は、ENDアクション(存在する場合)の前に発生します。ファイル引数がない場合は、標準入力を処理する前に割り当てが実行されます。
例:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four
awk
であることを優先しました ...これは大きな結果です、すなわち。では、すべてのファイル名がこのフォームを持っている場合、それは無視されますと、変数が設定されます...この衝突を回避するための唯一の方法は、現在の作業ディレクトリのためにそのファイル名を確保することであると思わ必ずしなければならない前に置かれ相対パスで:./var=three
-v
構文が導入された理由の1つです。-v
今後は、構文を割り当てを行うための推奨される方法と考える必要があります。
awk
、あなたは以下のキャッチを使用することができます:[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
これは、外部で変数を設定する古いスタイルですawk
。あいまいなため(ファイル名がの場合はどうなるかfoo=cat
)、それ以降のバージョンでは-v
オプションが追加されました。おそらく下位互換性のために機能するはずですが、保証はできません。そして言ったように、-v
オプションは新しいので、のすべてのバージョンがawk
それをサポートするわけではありません。
s answer](http://unix.stackexchange.com/a/34258/9537),
-v`で説明したように、引数の割り当ては、いつ有効になるかが異なります。また-v
、POSIXにあり、最も古いawk
実装を除くすべてに存在する必要があります。./
ファイル名に識別子以外の文字が含まれていることを使用または確認することは、明確にするためのおそらく最も信頼できる方法です。