• ベストアンサー

シェルのcase文で正規表現を使って1~99までだったらというようにしたい

#!/bin/sh case $1 in [1-9])echo $1;; [1-9]*10+[1-9])echo $1;; *)echo "エラー";; esac シェルの第一引数が1~99だった場合、その引数を表示するというものを作りたいのですが、 これだと二桁の数字を入力した際に*)echo "エラー";;の方へ行ってしまいます。 これではだめでしょうか? またもしcase文でこういった事ができるのなら今は2行に渡って書いていますが、 これを1行にして書くことなどはできるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「1~99」の中に 50 なんてのは入る? case は文字列として (厳密にはファイル名として) 比較してるよん. だから 2つ目は [1-9][0-9]) じゃないとダメ. まあ, | でパターンをつないで [1-9]|[1-9][0-9]) echo $1;; でいいんだろうけど.

wachi888
質問者

お礼

なるほど!そういえば一桁目0のことをあまり考えてませんでした。 そういうことでしたか・・・。 パターンのつなぎ方もとても参考になりました。 ありがとうございました。m(_ _)m

関連するQ&A

  • case文で困っています。

    こんにちは! 当方Linux初心者です。 現在、シェルを作成しているのですが思うように表示されなくて 困っています。 どなたかご教授いただけないでしょうか? 目的:引数を「数字」か「それ以外」かを判別するシェルを作成 #!/bin/bash case $* in [0-9]+) echo "数字" ;; *) echo "その他" ;; esac 上記のように作成したところ、全てその他と判別してしまいます。 宜しくお願い致します。

  • case inの制御文

    シェルスクリプトの下記ソースに間違いはないですか? 最後のesacの次に改行は必要ですか? #!/bin/sh echo teststart i=2 case $i in 1) echo "a" ;; 2) echo "b" ;; *) echo "c" ;; esac

  • "#"をcase文のパターンニ指定する

    題名にあるように、具体的には case $1 in #aaaa) echo OK! ;; *) echo NG ;; esac という風に引数に、#、を用いた場合のスクリプトを書きたいのですが 2行目の#の行がコメント行として扱われるのか うまく処理できません。 どうしたらよいでしょうか? よろしくお願いします。

  • シェルスクリプトの内容の確認

    Solarisのスクリプトについて教えてください。 以下のスクリプトファイルが登録されており、その内容の詳細を確認したいと思っております。 (1) 5行目の "$1" は何を意味しているのでしょうか? (2) 12行目の 「echo 」文内に「{ start | stop }」と記述がありますが、この start / stop はどの情報を元に判断して結果が出力されるのでしょうか? (3) 12行目の 「echo 」文のコマンドの後に、13行目「exit 1」と14行目「;;」がありますが、 これはどちらの行でcase文を抜けるということになるのでしょうか? ========================================================================================= #!/bin/sh # # /etc/init.d/nodemanager.sh # case "$1" in start) if [ -f /home/bea81/weblogic81/server/bin/startNodeManager.sh ] ; then /bin/su - weblogic -c 'cd /home/bea81/weblogic81/server/bin;./startNodeManager.sh &' fi ;; *) echo "Usage: /etc/rc2.d/S99nodemanager{ start | stop }" exit 1 ;; esac exit 0 ========================================================================================= よろしくお願いいたします。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • shシェル:case文のワイルドカードのエスケープについて(再)

    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版でこんな間違いをするかなぁ?とも思いまして。 ひょっとして私がなにか誤解していますでしょうか? よろしくお願いします。

  • Kシェルが動作しない。

    Kシェルが動作しない。 以下シェル自体ですが、単体では動作するのですが、メインのシェルから呼び出すと動作しなくなります。 動作しない条件としては、子シェルがメインシェルのwhile文の中に入れていると無限ループ???してしまいます。(for文やそれ以外では動作します。) なにかご存知でしたら、ご教授願います。 ・子シェル(Yes or Noを入力するまで無限ループする) #!/bin/ksh answer= echo "Do you add xxxx ? ---> [y/n]\c" while : do if [ "`echo -n`" = "-n" ]; then echo "$@\c" else echo -n "\@" fi read answer case "${answer}" in [yY] | yes | YES | Yes ) return 0 ;; [nN] | no | NO | No ) return 1 ;; * ) echo "Please enter y or n." ;; esac done ・メインシェル #!/bin/ksh while read line do /xxx/子シェル.ksh done < /xxx/zzz.txt 分かりづらいかも知れませんが、ご容赦願います。

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • シェルスクリプトbashについての質問

    #!/bin/bash # トップ画面 function TOPVIEW() { echo "1)クイズ開始" echo "2)このアプリを終了" echo "3)アプリについて" echo "4)クイズ正解率" while echo -n "1,2,3,4を選択してください:" read ANS do case $ANS in 1) echo "正解" break;; 2) echo "終了します";; 3) echo "クイズアプリです";; 4) echo "正解率は";; *) echo "答えは1,2,3,4で入力";; esac done } # 問題作成 function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } 最初の選択でクイズ開始を選択すると問題文に移行、、 終了を選択すると終了できるようにしたいのですが、 設定がわかりません どなたか教えてください お願いします

  • シェルスクリプトbashについての質問

    シェルスクリプトbashについての質問 #!/bin/bash function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } QUIZ01 QUIZ02 要件として トップ画面で選択肢 1.クイズ開始 2.アプリについて 3.アプリ終了 4.クイズ正解率 クイズを開始したら、 クイズは全5問で3問不正解でアプリを終了 問題の画面には現在の成果率が表示される 問題文は外部ファイルとする 問題の出現方法はランダムとして、問題は重複しない どうか教えてくださいお願いします

専門家に質問してみよう