スクリプトの処理中に、次のスクリプトでエラーが発生します。
file * | awk '{ ${1}=""; print substr(${0},2) }';
次の両方のスクリプトは正常に実行されます。
file * | awk '{ $"1"=""; print substr($"0",2) }';
そして
file * | awk '{ $1=""; print substr($0,2) }';
パラメータ置換に関するすべてではありませんか$1, ${1}, $"1"
?私のawk
文法に問題があるのでしょうか?
答え1
awk
殻ではありません。awk
独自の文法、構文、意味があります。は構文上正しいコード${1}
ではありませんが、とは両方です(そして同じです)。では代替品ではありません。awk
$1
$"1"
awk
awk
これらのうち、awk
現在の$1
入力レコードの最初のフィールドを表し、完全な入力レコードを$0
表し、シェルでは最初の位置パラメータ(通常はスクリプトまたは関数コマンドラインの最初のパラメータ)を表し、通常は現在のシェルまたはシェルスクリプトの名前です$1
。$0
シェル変数とawk
変数も完全に別個です。そのため、シェルからスクリプトに値を「インポートする」必要がある場合は、awk
コマンドラインフラグを使用してその変数を設定する必要があります。-v
awk
$ awk -v var="$var" '{...}'
awk
次のようにスクリプトにシェル変数の値を指定することもできます。
$ awk '{...}' var="$var"
これはほぼ-v
変数がvar
すべてのブロックで空であることを除いて、withを使用するのと同じ操作ですBEGIN
。ブロックBEGIN
が実行されます今後入力データの表示と変数の設定後ろにそのようなブロックの実行。
あなたもできます。
$ awk '{...}' var="$value1" file1 var="$value2" file2
これにより、変数は処理されたばかりのシェル変数の値を取得し、処理されたばかりのシェル変数のvar
値を取得します。$value1
file1
$value2
file2
もしそうなら文書前の例の名前var="$value1"
(var="42"
例:完全に有効なUnixファイル名)を使用すると、ファイルは次のようになります。いいえ処理されます。また、コマンドラインのシェルファイル名グロービングパターンが名前が変数の割り当てのように見えるファイルを選択すると、その割り当てはスクリプトで有効になりますawk
。