#!/bin/sh
case $1 in
[1-9])echo $1;;
[1-9]*10+[1-9])echo $1;;
*)echo "エラー";;
esac

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

A 回答 (1件)

「1~99」の中に 50 なんてのは入る?


case は文字列として (厳密にはファイル名として) 比較してるよん.
だから 2つ目は
[1-9][0-9])
じゃないとダメ.
まあ, | でパターンをつないで
[1-9]|[1-9][0-9]) echo $1;;
でいいんだろうけど.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/03 12:46

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q拡張子の正規表現

emacs や xyzzy で、
設定ファイルの中に、
拡張子の正規表現として、

 \\.vbs

のような表現がありますが、
ずっと以前から疑問に思っています。

 \.vbs

なら意味がすぐに分かるのですが、
その前に \ をつける必要性が分かりません。

この \ (私にとりましては余分に見える \ )には
どのような意味があるのですか?
どなたかお教え願えませんでしょうか?
どうぞよろしくお願いします。

Aベストアンサー

>つまり正規表現関数に渡されるのは2番目の \ 以下の文字列、
>ということでよろしいんでしょうか?

はい、そうです。
日本語環境だと円マークですが、海外だとバックスラッシュのことが
ほとんどで、バックスラッシュがたくさんあるさまをみて
爪楊枝が並んでいるようだとかいわれたりしています。

Q#!/bin/sh

test.shを実行すると、test.shのフォルダに現在の時刻を書いたt.txtを作成するというtest.shのソースを教えてください。

Aベストアンサー

#!/bin/sh

output_file=./t.txt

# 年月日時分秒
now_dt=`date '+%Y%m%d%H%M%S'`

echo $now_dt > $output_file

こんな感じでしょうか?

Q正規表現を教えて下さい。

正規表現を教えて下さい。
1行目の各拡張子を(赤)、2行目の行頭のsakuraを(青)、それ以外を(黄)に色分けする正規表現を教えて頂けないでしょうか。

[.txt;.ini;.cfg;
sakura|"D:\Program Files\sakura\sakura.exe" "%P"
]

サクラエディタ ver.1.6.50

Aベストアンサー

> 2行目のパス部分の拡張子(.exe)は、「それ以外(黄)」にしたいのです

もともとの質問には、それ以外の部分(黄色)は2行目の拡張子だとはどこにも書かれていなかったので、最初の回答ではテキスト全体を黄色に指定しましたが、そういうことじゃないんですね?だとすると、完全な形ではできません。と言うのは1行目のキーワードとかぶっているからで、妥協しないと無理です。

2行目の拡張子の色分け:(正規表現キーワード3)ただしダブルクォートまで色が変わる
/\.[^.]+"/k

よく考えたら、通常の正規表現じゃない色分けが動くと、ダブルクォートで囲まれた部分が「文字列」として色分けされてしまうので、この色分けが働かないように(色分けのチェックボックスを外す)しておく必要もありそうです。

Q#!/bin/gawk -f ???スクリプトの一行目

bashのスクリプトの一行目に、環境に合わせて、
#!/bin/gawk -f
とか
#!/usr/local/bin/bash -f
とか書かないとだめですよね。

環境が変わるごとに(bashのパスが変わるごとに)この部分を書き換えるのが面倒なのですが、よい方法はないものでしょうか?

Aベストアンサー

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル以外から起動される場合はエラーになりますが。直接シェルから起動しなくても例えばC言語のsystem()関数はシェル経由でプログラムを起動するのでこういった場合もOKです。

>・env がスペース付き引数に対応する
env は元々、env VAR=value cmd arg1 arg2 のようにcmd arg1 arg2 を実行する際に環境変数VARにvalueという値を設定してから実行するというコマンドなのでこういう変更はありえないです。envの改造じゃなくてコマンドラインを解析するミニシェルを作ってそれを
#!/bin/minish awk -f のように指定すればOKです。

>・"gawk -f" に対応するコマンド gawkf (?)を用意する(gawk -f を一つの引数にするため)
そのgawkfをどこのディレクトリに置くかという問題が新たに発生します。

ちょっとトリッキーで一部制約もありますが、shはまず間違いなく/binにあるので、gawkの場合、

#!/bin/sh
ZZ==1{ exec sh -c "cat $@ | gawk -f $0" ;}
awkスクリプト
。。。

で、大抵のケースは出来ると思います。上に書いたようにシェルからしか起動しないなら1行目は不要です。

ruby言語だとこういうことを想定してあって、#! ruby という行まで読み飛ばす -x というオプションがあります。この際、rubyに乗り換えては?
#!/bin/sh
exec ruby -S -x $0 $@
#! ruby
rubyスクリプト
。。。

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル...続きを読む

QVB2010の正規表現

VB2010の正規表現についての質問です。
ファイル名に複数のドット(ピリオド)が含まれる時や、複数の拡張子がある時でも、
一番最後にある拡張子だけを取り出したいのです。

System.Text.RegularExpressions.Regex("正規表現")
で正規表現を指定していますが、

例えば、『T.M.Revolution.m3u』の場合は、『.m3u』だけを取り出したいので、

("[.].*$")

とすると、マッチする部分が『.M.Revolution.m3u』となる為、

("([.].*){1}$")

に、試しに変更してみましたが、失敗してしまいました。


知っている方、
『上記の書き方だと何故ダメなのか』 と、 『この場合の正しい正規表現』
を教えていただけませんか?

あと、正規表現ではない代替案などが有れば、是非それも教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

正規表現なんて使わなくても、
dim hoge as string = "T.M.Revolution.m3u"
dim extension as string = hoge.Substring(hoge.LastIndexOf("."))

とかでいいんではないでしょうか。

もしくはPath.GetExtension()を利用して
imports System
dim hoge as string = "T.M.Revolution.m3u"
dim extension as string = Path.GetExtension(hoge)

みたいな。

Qシェルで正規表現 YYYY/MM/DD

引数で受け取った文字列が YYYY/MM/DD形式であるかを判定したいのですが、シェルが初めてなのでよくわかりません・・・。

どなたかご教授ください!
よろしくお願いします。

Aベストアンサー

数字とスラッシュの並びであることを判断したいのなら正規表現を使うまでもなくファイルマッチで出来ます。

case "$1" in
[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]) FLAG=true ;;
*) FLAG=false ;;
esac
if $FLAG
then echo YYYY/MM/DD 形式
else echo YYYY/MM/DD 形式でない
fi

日付として正しいかはまた別の話。

Q正規表現で絶対パス表示のファイル名からファイル名だけを削除したい

Perlの正規表現を使って
c:\xxxx\xxxx\xxxx\xxxx\abc.txt
のようにファイルの絶対パスで記述されている文を
c:\xxxx\xxxx\xxxx\xxxx
のように
ファイル名部分だけを削除して、
フォルダの絶対パスに
表示させる正規表現を教えていただけないでしょうか?
ちなみにxxxxは可変値、階層の深さも決まっておらず、
ファイルの拡張子もtxt,htm,拡張子なしなどです。

よろしくお願いいたします。

Aベストアンサー

最下行しか変換されないということですが、

$file='C:\xxxx\xxxx\xxxx\xxxx\abc.txt<改行>C:\yyyy\yyy\yyy\def.htm<改行>D:\zzz\ghi.doc'

みたいな形でデータが入っているのではないかと思います。(改行入っているかどうかまでは判断できませんが)

もしそうであれば、
$file=~s/\\[^\\]*\r/\r/g;
で解決すると思います。

Q自分のPCにIISを入れたときの、配布CGIの !/usr/bin/perl って?

よく無料で配布されている、
掲示板とかの初めの行に !/usr/bin/perl 
をプロバイダにあわせて直してくださいと
記述がありますが、、

自分のPCにIISをインストールして
運用したいとき、自分のPCがプロバイダ(?)
なわけで、どのように設定すればよいのでしょうか?

Aベストアンサー

何でもいいです。
!/usr/bin/perl 
でも
!/usr/local/bin/perl 
でも。
元々これはLinuxサーバ上での法則のようで、Windows上では無視されるようですよ。

参考URL:http://www.lira.co.jp/t-room/xp_server/

Qperl 正規表現 抽出

perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように
書けばいいのかわかりません。

実現したいことは
「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」
というテキストに対して
「拡張子」のみを抽出することと
「ファイル名」のみを抽出することです。

パターンマッチや変換はなんとなくわかるのですが
抽出の仕方がよくわかりません。
よろしくお願いいたします。

Aベストアンサー

File::Basenameを使うのがよいかと。
http://perldoc.perl.org/File/Basename.html

もしかすると、cmd.exeでdirとforを使うか、Scripting.FileSystemObjects使うほうが楽かもしれない。

参考URL:http://www.ideone.com/EAlSM

Q秀丸の正規表現を使って~~~を消したい

こんにちは。質問させていただきます。

タイトルの通りなのですが、何千行にも渡る文章中のほとんどに
下記の様なタグがふってあるとします。
<FONT color="#ff0000">の部分は当然様々な色を使ってますし<FONT face="Osaka,MS ゴシック">や
<FONT color="#ff0000" FONT face="Osaka,MS ゴシック">もあります。

<FONT color="#ff0000">~様々な文章1~</FONT><BR>
<FONT color="#ff0022">~様々な文章2~</FONT><BR>
<FONT color="#ff0033">~様々な文章3~</FONT><BR>
    ↓
~様々な文章1~<BR>
~様々な文章2~<BR>
~様々な文章3~<BR>

それを上記のように文章のみを残して開始タグと閉じタグだけを削除したいのですが、
効率のよい方法ってありますでしょうか?
全てを消すのではなく部分的に消したいため困っております。

例えば、最初にフォントの開始タグだけを消してしまうと、
</FONT>タグは他の必要なタグと混ざってしまい消せなくなってしまいます。
正規表現がまだ全然未熟なもので…。どうかご指導お願いします┏○

こんにちは。質問させていただきます。

タイトルの通りなのですが、何千行にも渡る文章中のほとんどに
下記の様なタグがふってあるとします。
<FONT color="#ff0000">の部分は当然様々な色を使ってますし<FONT face="Osaka,MS ゴシック">や
<FONT color="#ff0000" FONT face="Osaka,MS ゴシック">もあります。

<FONT color="#ff0000">~様々な文章1~</FONT><BR>
<FONT color="#ff0022">~様々な文章2~</FONT><BR>
<FONT color="#ff0033">~様々な文章3~</FONT><BR>
    ↓
~様々な文章...続きを読む

Aベストアンサー

FONTが入れ子になってなければ、
<FONT .*?>(.*?)</FONT>

\1
で置き換えます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報