• 締切済み

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

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

みんなの回答

  • notnot
  • ベストアンサー率47% (4847/10260)
回答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

  • エクセル関数で文字列か数値かを判断する

    エクセルの関数で指定した場所のデータが文字列か数値かを判断させることは可能でしょうか? 可能な場合、それをIFとからめて「文字列だったら○○」「数値だったら○○」という条件をつけて処理をしたいのですが。 よろしくお願いします。

  • switchでの条件分岐の書き方を教えて下さい。

    こんにちは。 いつもお世話になっております。 またわからない事が出てきてしまったので、どうか ご指導よろしくお願いいたします。 簡単な検索機能をつくりたくて、思考錯誤 しております。 フォームからPOSTで受け取る変数の数は 10個あります。 それぞれの変数が ””でなければ、受け取った 変数を元に、SQL文がかわってゆく。 という事がしたいのです。 10個もあるので、たとえば 変数が$_POST["a"]から$_POST["j"]まであった時に if文を使うとすると if($_POST["a"] != "" && $_POST["b"] == "" && $_POST["c"] != "" (略)){ $stt = "検索したい予定のSQL文1"; }elseif($_POST["a"] == "" && $_POST["b"] != "" && $_POST["c"] != "" (略)){ $stt = "SQL文2"; ・ ・ ・ と言う風に、ものすごいにはなると思うのですがifを つなげていけば良いのかな、と思うのです。 PHPの基礎HPなどを検索してみると、SWITCHを 使えば、多岐に分岐するIF文を、見やすくできる、 と書いてあったので、使ってみたいのですが、書き方の 説明によると switch(変数){ case 値1:  条件を満たす時の処理1 break; case 値2:  条件を満たす時の処理2 default: } と紹介してあったのですが、今回わたしがしたい場合の 条件分岐だと、変数は一つではなく、ある変数は空でこの変数は値が何か入っていて、またもう一つの変数は 空で・・・の時は、このSQL文、というように させたい場合には、switchでどうかけばよいのか わからないのです。 それとも、こういう条件分岐の場合は、switchを 使うべきではないのでしょうか・・・? どうかご指導よろしくお願いいたします。  

    • ベストアンサー
    • PHP
  • 条件分岐

    JavaScriptで、「if文を使用して0~9のランダムな数字を取得して出た数字と偶数か奇数かの2つの情報を表示する」 「0~2のランダムな数値を3つ取得して、それぞれの数値と最も数値が大きい変数の情報を表示する(最も数値が大きい変数が複数ある時は複数表示)」 プログラムはそれぞれどのようになりますか?

  • 条件分岐

    以下の条件分岐について教えてください。 条件:str の 文字に ”0.0”や”0000”などの入力があっ   た場合、NG_FLAGを返したいのです。 どこがいけないのか、教えてください。 int CheckData2(char *str) {  if (str[0] == '0');{   printf("%c", str[0]);   if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はOK_FLAG");    return OK_FLAG;   } else if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はNG_FLAG;");   return NG_FLAG; } } puts("CheckData2はOK_FLAG"); return OK_FLAG; }

  • 条件分岐について

    Javaの条件分岐のことで質問させていただきます。 入力された値によって、適切なHTMLタグを表示するプログラムを作っています。 「画像の表示」「画像の幅」「画像の高さ」と項目をわけてそれぞれにJTextFieldを設置し、画像の名前や高さなどを入力。画像の高さと幅についてはJCheckBoxを1つ設置し高さと幅を指定する場合はチェックし、指定しない場合はチェックを外す。という方法を考えています。 現在はif文で「画像の表示」に画像ファイル名(拡張子まで)を入力、「画像の高さ」「画像の幅」に高さと幅を数字で入力、 チェックボックスにチェックを入れ、ボタンを押したらJTextAreaに「<img src="画像ファイル名" Width="幅" Height="高さ">」と表示することはできています。 しかし画像の名前のみ入力して、高さと幅を指定しない(チェックボックスのチェックを外す)など、別の処理を行うif文を上記のif文の後に書いても実行することができません。 switch文で処理を分岐させることも考えていますが、式を上手くかけず悩んでいます。 if文などで上手く処理を分岐させるにはどうすればいいでしょうか?

  • 文字列か数値か判定する条件式

    こんにちは。 A1が文字列なら0。A1が数値ならA1そのもの。 というIF文を作りたいのですが、  =if(A1=文字列,0,A1)  ←こんな感じ 条件式はどう書けばいいのでしょうか?  A1=string ←ではだめでした。  not A1=numeric ←でもだめでした。 ご教示ください。

  • ''C++の条件分岐分からないんですが

    #include<iostream> using namespace std; int main(){ int a; cout << "数値を入力してください\n"; cin >> a; if( a > 30) cout <<"31以上ですね\n"; } else if(a<10){ cout <<"10未満ですね\n"; } else { cout <<"30以下で10以上ですね\n"; } return 0; } これが例文なんですが、 変数aの値がbより小さい場合には、『aはbより小さいです』と表示させ、大きい場合には"a=a+b"を計算させる 文字変数mの中身が'a'ならば、『aが格納されています』と表示させて、'a'でないならば『'a'でない文字が格納されています』と表示させたあと、変数bとcを使った『b=b+c』を計算する。 変数aが、変数bより小さい場合には、『aはbより小さいです』と表示し、変数bより大きい場合には、『aはbより大きいです』と表示し、変数bと等しい場合には、『aとbは等しいです』と表示する #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else { __c = a + b; }return 0; } #include<iostream> using namespace std; int main(){ int a; if(m == 'a') __cout("aが格納されています\n"); } else { __cout("\'a\'でない文字が格納されています\n"); } return 0; } #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else if(a == b) { __cout("aとbは等しいです\n"); } else { __cout("aはbより大きいです\n"); } return 0; } これ合ってますか?あとプログラミング環境すらないので実行結果教えてもらっていいですか?

  • 文字列で条件分岐 if swtich

    C言語でifやswitch文の条件式でキーボード入力からの複数文字列(char型)に対して条件分岐をしたいのですが、どなたか具体例を教えていただけないでしょうか?またscanfでキーボード入力を読み込む場合、Enterを押さないと実行されませんが、Enterを押さないでもいい関数や方法があれば教えて下さい。宜しくお願いします。

  • 条件分岐が多いIF分の書き方について。

    テキスト入出力でのIF分についてご質問がございます。 例えば条件が多いときに、結果が得られない時があるのですが 書き方で何か問題があるのならご指摘ください。 下記のコードでご説明します。 //コード1の文字列が04でコード2の文字列が01の場合00001を表示 if (コード1.compareTo ("04") == 0 && コード2 .compareTo ("01") == 0 ) { out.print ("00001"); //コード1の文字列が04でコード3の文字列が2の場合00005を表示 } else if (コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 ) { out.print ("00005"); //コード1の文字列が08でコード3の文字列が07の場合10000を表示 } else if (コード1.compareTo ("08") == 0 && コード3 .compareTo ("07") == 0 ) { out.print ("10000"); //コード1の文字列が10でコード5の文字列が07の場合30000を表示 } else if (コード1.compareTo ("10") == 0 && コード5 .compareTo ("07") == 0 ) { out.print ("30000"); //それ以外エラー } else { out.print("エラー");} } 値がIF分の条件とマッチしていても if (コード1.compareTo ("04") == 0 && コード2 .compareTo ("01") == 0 ) { out.print ("00001"); //コード1の文字列が04でコード3の文字列が2の場合00005を表示 } else if (コード1.compareTo ("04") == 0 && コード3 .compareTo ("02") == 0 ) { out.print ("00005"); //コード1の文字列が08でコード3の文字列が07の場合10000を表示 } else if (コード1.compareTo ("08") == 0 && コード3 .compareTo ("07") == 0 ) { out.print ("10000"); このコードまでに当てはまらない条件はすべて ("10000"); の結果になり つまりそれ以降のelse if の条件に 当てはまらなくなります。 else if をいくらでも増やして条件分岐出来ると学習して 検証しているのですが・・・ 最終的にがIF~else if ~elseで 30パターンぐらい条件分岐したいと思ってます。 初歩的なご質問で恐縮ですが アドバイス よろしくお願いします。

    • ベストアンサー
    • Java
  • 【C言語】文字列による処理の分岐について

    いつも丁寧な解説拝見しております。 C言語について質問させて頂きます。 シリアル通信によって受信した1バイトの文字列があるとします。 この文字列のパターンよって処理の分岐をさせたい場合、コードはどのように書けば良いのでしょうか。 より具体的に申しますと、 →文字列パターン1の場合、関数1を呼び出す。 →文字列パターン2の場合、関数2を呼び出す。 →文字列パターン3の場合、関数3を呼び出す。・・・・・・ と、100パターンほどの文字列があり、それぞれにおいて異なる関数を呼び出したいと考えております。私の理解は以下に示す通りなのですが、どうも正しい処理が分らないでいます。 ・受信した文字列がどのパターンなのかを判断するために、strcmp関数で比較を行う。 ・多分岐なので、switch case文かelse if文を用いる。 この場合、条件式の中でstrcmp関数による比較を行えば良いのでしょうか。簡単にコードを示して頂ければ幸いです。C言語初心者なので理解に間違いがあるかもしれませんが、どうぞよろしくお願い致します。