3

次のコードでは、シェルの変数をawkに渡そうとしています。しかし、a.sh foo_barとして実行しようとすると、出力は「foo is notdeclared」になり、a.sh bar_barとして実行すると、出力は「fooisdeclared」になります。awkにバグがありますか、それともここで何か間違ったことをしていますか?

私はgawk-3.0.3を使用しています。

#!/bin/awk

model=$1

awk ' {

      match("'$model'", /foo/)
      ismodel=substr("'$model'", RSTART, RLENGTH)
      if (  ismodel != foo ) {
        print  " foo is not declared"
      } else {
        print  " foo is declared"
      }
     }
    ' dummy

ダミーは、空白行が1行のファイルです。

ありがとう、

4

3 に答える 3

2

複雑な引用符の代わりに、AWK の変数の受け渡しを使用する必要があります。

awk -v awkvar=$shellvar 'BEGIN {print awkvar}'

スクリプトはシェル スクリプトとして記述されていますが、AWK シバン行があります。に変更できます#!/bin/sh

于 2010-08-20T06:36:57.590 に答える
1

これはバグではなく、コードのエラーです。問題のある行は次のとおりです。

if (  ismodel != foo ) {

ここfooにあるはずです"foo"。現在、空の変数と比較しています。一致する場合は false になり、一致しない場合は true になります。したがって、問題はシェル変数の使用方法ではありません。

しかし、他の回答者が言ったように、引数を渡す好ましい方法は、スイッチawkを使用することです。-vこれは、awk スクリプトを別のファイルに入れることにした場合にも機能し、あらゆる種類の引用の問題を防ぎます。

また、ダミーファイルの使用法についてもわかりません。これは単なる例ですか?BEGIN {}それ以外の場合は、ファイルを省略して、すべてのコードをブロックに入れる必要があります。

于 2010-08-20T07:27:10.650 に答える
0

-vオプションを使用して、シェルから変数を渡します

awk -v model="$1" '{
  match(model, /foo/)
   .....
}
' dummy
于 2010-08-20T06:35:51.320 に答える