プロが教える店舗&オフィスのセキュリティ対策術

シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか?

例えば、以下のようなtest.shというファイルを作ったとします。
---------------
#!/bin/sh

AAA="x y"

echo "" | awk '{print $AAA}'
--------------
としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。)

printの部分を

・awk '{print '$AAA'}'
・awk '{print "'$AAA'"}'

などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

A 回答 (3件)

この場合、$AAAを展開するのは、awkではなく/bin/shです。



shで$AAAを展開して echo "" | awk '{print "x y"}'
の形にして実行します。
更に詳しく言えば
awkの引数が
{print "x y"}
という文字列になるようにします。
(awkにx yが一つの文字列として認識されるように""で括った状態に)
シングルクオートで括ってあるのは、sh側の都合で、awkにわシングルクオートは渡されません。

例えば
echo '' | awk "{print \"${AAA}\"}"
( "の中の"はバックスラッシュでエスケープ )

echo '' | awk '{print "'"${AAA}"`"}'
( 展開の必要の無い箇所はシングルクオートで。
展開する${AAA}の直前でシングルクオートを一旦閉じて
展開が終ったら、またシングルクオートで
)

ただ、どうしても煩雑になるので、やはり、直接awkの変数に代入するオプションを使った方がいいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。原理まで教えていただいて助かります。
awk以外には、これらの方法で応用したいと思います。

お礼日時:2010/08/05 22:06

---------------------------------------


#!/bin/sh

AAA="x y"

export AAA

awk 'BEGIN {print ENVIRON["AAA"]}'
---------------------------------------

export しないとうまく取得できませんでした。
また、環境変数の取得は ENVIRON を使いました。
echo ""は、説明がないとなんだかわからないのでなるべく使わない方がいいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。ENVIRONというのは始めて知りました。

お礼日時:2010/08/05 22:05

代替案とも言えるけど、awk の変数に入れてやったら?



echo "" | awk -v aaa="$AAA" '{print aaa}'
    • good
    • 0
この回答へのお礼

ありがとうございます!
ひとまず、これでうまく行くことが確認できました。助かりました。

ただ、今後の為にも、もし可能なら直接変数を代入できるかどうかを知りたいので、もうすこしだけ質問を受け付け続けさせてください。

お礼日時:2010/08/04 22:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています