7

理論的な質問があります:

1) getline() のシステムに変数を渡す方法は?

awk 'BEGIN{var="ls"; var | getline var; system("echo $var")}'

2) 変数を出力システム ("ls") に割り当て、結果を awk に出力する方法は?

awk 'BEGIN{var="system("ls")"; print '$var'}'

3) システム (var = "ls") で変数を割り当て、awk で結果を出力できますか?

awk 'BEGIN{system(var="ls"); print "'"$var"'"}'

情報ありがとうございました。

編集:

torek : ご回答ありがとうございます。

最初の例では、これを行うことができることを理解しています:

awk 'BEGIN { while ("ls -l" | getline var) system("echo " var  );}'

このアプリケーションでは、システム () からの変数出力を割り当てることはできませんか? この例のように:

awk 'BEGIN {var="ls -l"; system(var); print var}'
4

1 に答える 1

15

あなたはこれを間違った方法で見ていると思います。Awksystemは古い文字列を取得するだけなので、次のように指定します。

system("echo " var);  # see side note below

(awk では、文字列は隣接によって連結されることに注意してください)。さらに、systemコマンドを実行するだけです。getlineその出力をキャプチャするには、質問 1 と同様にを使用する必要があります。

のすべての出力を読みたい場合はls、 からの結果をループする必要がありますgetline

awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }'

これはBEGINアクションのみを定義するため、awkを起動して実行しls、各出力行を収集して出力し、終了します。


補足: シェルに渡される変数には十分注意してください (これにはsystem、 の左側の と の呼び出しの両方が含まれます。さらに、コマンドを実行するものすべて| getlineの最近のバージョンのその他のケースも含まれます)。awk逆引用符、$(command)、およびセミコロンはすべて、ユーザーが任意のコマンドを呼び出すことを可能にします。たとえば、system("echo " var)上記の例では、 if varcontains; rm -rf $HOMEコマンドは次のecho ; rm -rf $HOMEようになります。

「悪い」文字をチェックし、オブジェクトを引用するか引用することができます。$最新の 8 ビット クリーン シェルでは、 (構文の有効性<のため>に) 、、、、、|および`. 単一引用符を使用して引数を引用する場合 (それらを単一の「単語」として表示するため)、単一引用符をエスケープするだけで済みます。詳細については、この unix.stackexchange.com の回答を参照してください。


もう 1 つの注意点: 私は awk スクリプトに "不要な" セミコロンを追加して、構文的に C に似たものにする傾向があります。何十年も前からの古い習慣。

于 2012-04-04T09:49:11.657 に答える