GNU awkはパラメータをパスとして扱おうとします。

GNU awkはパラメータをパスとして扱おうとします。

以下の最小限の例がありますawk

#!/usr/bin/awk -f
BEGIN {
  if (ARGC>1)
    a=ARGV[1]
  else
    a=5
}

{
  print
}

で呼び出すと、次のようにls -l|./t.awkなります。

$ ls -l|./t.awk 2
awk: ./t.awk:4: fatal: cannot open file `2' for reading (No such file or directory)

Argument() なしで呼び出すとls -l|./t.awk問題はありません。

だから最初の質問は、単純な文字列同一性チェックの代わりに「2」というファイルを読み取ろうとすることです。

2番目の驚くべきことは、2番目のブロックを削除すると正常に動作することです! (空の出力を提供します。)

#!/usr/bin/awk -f
BEGIN {
  if (ARGC>1)
    a=ARGV[1]
  else
    a=5
}

なぜですか?

ベストアンサー1

awkはパラメータを提供しますが、最終的に必要に応じてパラメータを操作できます。たとえば、argを空白に設定します。

if (ARGC>1) {a=ARGV[1]; ARGV[1]=""}
else a=5

それ以外の場合、argsはオプションではなくエントリの入力ファイル名である一般的な機能を持ちます。したがって、awkは「2」ファイルを読み取り、そのファイルからスクリプト本文を実行しようとします。

おすすめ記事