プロが教えるわが家の防犯対策術!

shシェルスクリプトのcase 文のワイルドカードのエスケープについて質問させて下さい。
(初め「プログラミング > その他(プログラミング)」で質問しましたが、
プログラムと言うよりもシェルの話しなのでこちらに移しました。)

#!/bin/sh
case "$i" in
[Yy]"*" ) echo "Y(literary *) or y(literary *)" ;;
[Yy]* ) echo "Y(wild-card *) or y(wild-card *)" ;;
"[Yy]*" ) echo "(literary [Yy]*)" ;;
"[Yy]"* ) echo "(literary [Yy])(wild-card *)" ;;
esac

とした場合、"$i" の内容に関し、
1番目は、Yまたは yの後に文字通り*
2番目は、Yまたは yで始まる任意の文字列
3番目は、文字通り [Yy]*
4番目は、文字通り [Yy] で始まる任意の文字列

の場合分けという理解でよろしいでしょうか。

私のシステム
GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)
で走らせると、上のように振舞うように思うのですが、
現在読んでいる
ブルース・ブリン
「入門UNIXシェルプログラミング 改訂第2版」(ソフトバンク)
第5刷、p34 の説明で

"[Yy]" ) の説明が 「これはYあるいはyに限る」
"[Yy]*" ) は 「これはY* あるいは y* と言う文字に限る」
"[Yy]"* ) は 「Y か y で始まる文字列 」

と説明されているので、疑問に思いました。
私が正しく理解していれば、上の説明は誤りで、上の3つの説明に合うのは、
それぞれ、
[Yy] )
[Yy]"*" )
[Yy]* )
であるはずなのですが、いかがでしょう。

この本はシェルスクリプトの良書としてよく読まれているようで、
しかも第2版でこんな間違いをするかなぁ?とも思いまして。
ひょっとして私がなにか誤解していますでしょうか?
よろしくお願いします。

A 回答 (2件)

良く読まれてますね~



私は初版を持っているのですが、確かにそう掛かれていますね。でも同書 p.11 を見る限り、ダブルクォートで囲った場合には [ も ] もただの文字扱いになると書いてありますし、p.34 の方は間違いだと思います。
    • good
    • 0
この回答へのお礼

>でも同書 p.11 を見る限り、ダブルクォートで囲った場合には [ も ] もただの文字扱いになると書いてありますし、

そうなんです! それで、読み進んでこの例を見て、え?!
と思ったのです。
p11の説明を読んで、けっきょく「"」は、例えば、$STRINGとか`cat list.txt' などの「代入」を生かしたいときの他はほとんど「'」と同じね、とインプットされていたもので、矛盾するヤン!と思ったのです。

しかし、p34の間違い方が単なるミスプリレベルでないのでおかしいなあ?と思ったわけなのですが、
やっぱり間違いみたいですね。
(それとも、同じsh系シェルでもこの点の振舞いにちがいがあるのかなー。)

とりあえず、私の理解は間違っていないようなので安心しました。ありがとうございました。

お礼日時:2004/09/10 17:06

No.1 ですが、



> (それとも、同じsh系シェルでもこの点の振舞いにちがいがあるのかなー。)

私は FreeBSD の /bin/sh で試して、同じ結果でした。Linux と違って FreeBSD の /bin/sh は bash ではないので、少なくとも bash 固有の現象(?)ではないと思います。

# が、FreeBSD の /bin/sh も純粋な Bourne Shell では
# 無いらしいので、純粋な Boure Shell だと挙動が
# p.34 のようになるのかもしれませんね。
    • good
    • 0
この回答へのお礼

再びありがとうございます。
そうですか、少くともbash特有の現象ではないことも分かり参考になりました。
とりあえず出版社にメールしてみました。

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

お礼日時:2004/09/12 08:50

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