• 締切済み

UNIX(Cシェル)での数値判断での条件分岐がうまくいきません。

いつもお世話になっております。 宜しく御願い致します。 if文で数値判断により条件分岐をしようと思ってます。 条件は”0<変数<=20”(仮)で、エラーだと警告文表示後に変数入力部に戻したいのです。 変数を画面上から”変数 = $<”で読み込み、処理をしたいのですが、うまくいきません。 整数値だとうまく行く方法を見つけましたが、小数値が入るとNG、小数値でもうまく行く方法を見つけました(bcを使用)が、文字列が入力されるとNG、と行き詰まってしまいました。 入力値としては小数値を期待しているのですが、操作する人が間違って”3..2”や”2 5”、”4rr”等が入力された場合も偽の判断をもって処理を戻したいのですが、ifの形式がおかしいとか、文法上のエラーがあると表示され、うまく戻ってくれません。 なにか良い方法はないでしょうか? 要は、if(変数 > 0 && 変数 <= 20) then で変数の値が文字列、小数、整数問わずに処理をしたいだけなんですが・・・。 どうぞ宜しく御願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

expr等を使って正規表現で判断するしかないでしょうね。\| の前が小数値、後ろが整数値のチェックです。 expr以外でも正規表現が使えるコマンドなら何でもいいですが。 expr "$var" : '[0-9][0-9]*\.[0-9][0-9]*$' \| "$var" : '[0-9][0-9]*$' >/dev/null if( $status == 0 ) then  正常処理 else  エラー処理 endif

hamaddux
質問者

お礼

詳細な回答有難うございます。 このようなやり方は想像つきませんでしたが、条件をたくさん設定して、エラー入力を回避するしかないみたいですね・・・。参考にさせて頂きます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

文法エラーのメッセージを /dev/null に捨てたらどうですか。 あるいは、一旦 exprコマンドで数値としての形式を取っているか確かめてから、cshのif文を行うとか。 いずれにせよ、シェルスクリプトをcshで書くことはお薦めできません。 cshは対話利用にとどめてshで書く方が良いと思いますよ。

hamaddux
質問者

お礼

回答有難うございます。cshはいまいちですか・・・。 検討してみます。

回答No.2

Perlでコーディングすれば問題ないですよ。

hamaddux
質問者

お礼

回答有難うございます。 Perlはまだ勉強不足で、やってはみましたがやはり条件設定をたくさんしなければだめでした。

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

数値に見えないようなものは先に除外してから bc に送り込めばいいのでは?

hamaddux
質問者

補足

回答有難うございます。 それも考えたのですが・・・。 除外するための何か良い方法はありませんか? 変数を一度ファイルに取り込んでtrで変換とか考えたのですがどうもスマートでないので止めました。 if文のなかではメタキャラクタもうまく使えなくて英字の削除ができません。”.”や空白の処理もどうしたものかと思い、またまた現在作業停滞中でございます・・・。

関連するQ&A