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版でこんな間違いをするかなぁ?とも思いまして。
ひょっとして私がなにか誤解していますでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
良く読まれてますね~
私は初版を持っているのですが、確かにそう掛かれていますね。でも同書 p.11 を見る限り、ダブルクォートで囲った場合には [ も ] もただの文字扱いになると書いてありますし、p.34 の方は間違いだと思います。
>でも同書 p.11 を見る限り、ダブルクォートで囲った場合には [ も ] もただの文字扱いになると書いてありますし、
そうなんです! それで、読み進んでこの例を見て、え?!
と思ったのです。
p11の説明を読んで、けっきょく「"」は、例えば、$STRINGとか`cat list.txt' などの「代入」を生かしたいときの他はほとんど「'」と同じね、とインプットされていたもので、矛盾するヤン!と思ったのです。
しかし、p34の間違い方が単なるミスプリレベルでないのでおかしいなあ?と思ったわけなのですが、
やっぱり間違いみたいですね。
(それとも、同じsh系シェルでもこの点の振舞いにちがいがあるのかなー。)
とりあえず、私の理解は間違っていないようなので安心しました。ありがとうございました。
No.2
- 回答日時:
No.1 ですが、
> (それとも、同じsh系シェルでもこの点の振舞いにちがいがあるのかなー。)
私は FreeBSD の /bin/sh で試して、同じ結果でした。Linux と違って FreeBSD の /bin/sh は bash ではないので、少なくとも bash 固有の現象(?)ではないと思います。
# が、FreeBSD の /bin/sh も純粋な Bourne Shell では
# 無いらしいので、純粋な Boure Shell だと挙動が
# p.34 のようになるのかもしれませんね。
再びありがとうございます。
そうですか、少くともbash特有の現象ではないことも分かり参考になりました。
とりあえず出版社にメールしてみました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- MySQL SQLについて質問です。 SELECT TO_CHAR(TO_DATE('90-10-08.'YY- 4 2022/05/13 20:55
- 数学 5組のデータ (xx,yy) = (1.0 , 1.1), (2.0 , 1.0), (3.0 , 2 2023/01/09 16:52
- Java Java 年数計算 3 2023/01/28 10:52
- Yahoo!メール yahooメール使用できなくなった。 1 2022/07/05 11:45
- その他(住宅・住まい) 冬の札幌の暖房器具 4 2022/10/18 07:22
- 数学 高校数学で質問があります。 2 2023/02/13 16:40
- 電車・路線・地下鉄 GV-E400系とキハ110系とでは、どちらが航続距離が長いか? 2 2023/07/24 07:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlからsystemコマンド呼ばれ...
-
右クリックでファイル名をコピ...
-
ubuntuの端末の左にカレントデ...
-
ログインシェルについて
-
Cシェル内でBシェルの様な関数...
-
コマンドプロンプトとかで、net...
-
tcshなのにスクリプト構文中のs...
-
シンボリックリンクでリンク先...
-
Linux仮想コンソール?
-
[UNIXコマンド] eval教えて下...
-
シェルとシェルの間で環境変数...
-
シェルスクリプトで #!/bin/sh ...
-
シェルとは
-
正規表現*について
-
シェルスクリプトの切り替え?
-
(PC初心者)シェルスクリプト...
-
Cシェル内で自動ログアウトさせ...
-
シェルスクリプトに関する問題...
-
ログインシェルと対話型シェル...
-
export と set は違うの?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
export と set は違うの?
-
Cシェル内でBシェルの様な関数...
-
バックスラッシュの意味がわか...
-
シェルスクリプトで #!/bin/sh ...
-
.cshrc ファイルについて
-
『存在するかどうか分からない...
-
mac os x10.6.4のターミナルでp...
-
シェルスクリプトに関する問題...
-
posixでshellを起動したとき`da...
-
シェル 会話形式でエンターキ...
-
ubuntuの端末の左にカレントデ...
-
Linuxのファイル禁止文字
-
ターミナルが全く入力できない
-
BシェルとBashの違い
-
シェルスクリプトのbashとperl...
-
Linuxシェルによる同一文字列の...
-
msys(cygwin)で、シェルスクリ...
-
シェルの変数をMySQLに送る方法...
-
lsコマンド部分一致方法
-
UNIX(hp-ux)のコマンド履歴↑↓
おすすめ情報