ShellQuotingJapanese

シェルプログラミングの引用符、特に awk での引用符は初心者にとっては頭痛の種です。

Art Povelones は 1999 年 9 月 30 日にシェルでの引用符について長編のチュートリアルを投稿してくれました。これは非常に詳細過ぎるため FAQ で繰り返し使われていないのでしょう。もし、これを使ってみるのであれば、<http://groups.google.com/> から検索してみてください。

Tim Maher は <http://www.consultix-inc.com/quoting.txt> を提案してくれました。

以下の考え方がほとんどの目的を達成する上で多分ベストで、理解しやすく、そしてメンテナンスしやすいものでしょう。('@@' はシェルが文字をそのままコピーすることを確実にするために引用符で囲まれていて、環境変数の置き換えといったようなことをを解釈させることはありません。)

    cat <<'@@' > /tmp/never$$.awk
    { print "Never say can't." }
    @@
    awk -f /tmp/never$$.awk; rm /tmp/never$$.awk

もし、シェルの引用符による挙動をテストすることが多いのであれば、以下のようにしてみてください。

   (最初のものの冗長なものとして以下の 7 つの引用符の使い方を用いたものがあります)
   (上記リンクの 7 つの各項目を参照)

    awk 'BEGIN { q="'"'"'";print "Never say can"q"t."; exit }'
    nawk -v q="'" 'BEGIN { print "Never say can"q"t."; exit }'
    awk 'BEGIN { q=sprintf("%c",39); print "Never say can"q"t."; exit }'
    awk 'BEGIN { q=sprintf("%c",39); print "Never say \"can"q"t.\""; exit }'

しかし、以下のものが使えないということを知っておくべきです。

    awk 'BEGIN { q="\'"; print "Never say \"can"q"t.\""; exit }'

これは 7 項目のクォート方法の例の説明でも述べられていますが、3 つの異なるものでクォートされていることに注意してください。

    awk 'BEGIN { q="'
                     "'"
                        '";print "Never say can"q"t."; exit }'

次に、これらの引数が (スペースも含めて) ひとつの文字列として出現しています。

    BEGIN { q="'";print "Never say can"q"t."; exit }

これは以下のものと同じです。

    BEGIN { q="'"; print "Never say can" q "t."; exit }
                          ^^^^^^^^^^^^^  ^  ^^
                          |           |  |  ||
                          |           |  |  ||
                          vvvvvvvvvvvvv  |  ||
                          Never say can  v  ||
                                         '  vv
                                            t.

努力を惜しまないのであれば可能です。

                          Never say can't. (できないなんて言わないで)