• 締切済み

シェルプログラムの判定について

皆さんのお知恵をお貸しください シェルはcshです 目的set name = $<で$nameに入る文字が+-*/(一文字毎です)の時エラー処理をしたい 現状下記のプログラムですが判定出来ません set xx = $< set moji = `grep -c '[\-\+\*\/]' xx` if ( $moji == 1 ) then echo 文字に誤りがあります endif  else if ( $moji == 0 ) then echo OKです endif +-*/が入った時にエラーを出したいのですが+-*/をどう判定したらよいのか教えて頂けます様お願い致します。

  • hks2
  • お礼率87% (7/8)

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

cshは良く知らないので。 read moge #echo "$moge"|grep -q -e '[-+/*]' #if [ $? -eq 0 ] if expr index "$moge" '-+/*' >/dev/null then echo 'invalid input' else echo 'OK' fi

hks2
質問者

お礼

回答有難う御座います うまく判別出来ました bashですね bashも勉強したくなりました。

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

「grep から if」のところを「if test」にする... くらいしか思い付かない. 変数は 1個減るけど.

hks2
質問者

お礼

回答有難う御座います testですか思いつきませんでした 早速試させて頂きます。

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.2

>moji:Undefined variable. 変数が未定義というエラーなので、99% タイプミスが原因です。 >bashでどのように書かれますか? 薦めておいて申し訳ないですが、このケースだと、わかりやすく書くと大差ないものしか思い浮かびません。

hks2
質問者

お礼

回答有難う御座います bash変なお願い致しまして申し訳ございませんでした スクリプトはご指摘のようにタイプミスでした 現状下記で動作いたしております echo -n "input number * " set name = $< echo $name > aaa set name1 = `grep -c '[-+*/]' aaa` if ( $name1 == 1 ) then echo 文字に誤りがあります else echo OK endif ですがこのスクリプトを本体に組み込むと動作しなくなります 下記が本体のスクリプトです echo -n "誤差 = " set xx = $< echo $xx > xx if ( $xx == 0 ) then echo 0です else if ( $xx == 99 ) then exit else if ( $xx == '' ) then echo enterです endif sed -e 's/^/ /g' -e 's/$/}/g' xx > xxx mv xxx xx set xmojiii = `grep -c '[-+*/]' xx` if ( $xmojiii == 1 ) then goto g endif set xmoji = `grep -c '^ -*[0-]*\.[0-3][0-9]}' xx` set xmojii = `grep -c '^ -*[0-]*\.[0-3]}' xx` if ( $xmoji == 1 || $xmojii == 1 ) then goto l 別の処理に飛びます else g: echo "文字に誤りがあります もう一度誤差を入力して下さい" goto xback endif このスクリプトの目的は数字入力の規制を行う事です 下記の入力のみ受け付けたい 少数点第1位は0~3まで 0 0.0~3 0.0~30~9 -0.0~3 -0.0~30~9 .0~3 -.0~3 例 0 0.05 -0.05 0.15 -0.15 0.2 -0.2 .3 -.3等 現状数字の矛盾は回避できたのですが+-*/が回避できません 改めて皆様のお知恵をお借りできれば幸いです。

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.1

cshはスクリプト機能が貧弱なので、シェルスクリプトを書くならsh/bashなどのほうがいいです。 もとの物を出来るだけ変えないで書くと、 >set moji = `grep -c '[\-\+\*\/]' xx` を set moji = `echo "$xx" | grep -c '[\-\+\*\/]'` あとif文の構文がおかしいです。 if ( $moji == 1 ) then echo 文字に誤りがあります else echo OKです endif あと正規表現の '[\-\+\*\/]' はエラーではないですが、普通は '[-+*/]' と書きます。マイナスは範囲指定と見なされないように先頭か末尾の必要あり。

hks2
質問者

お礼

回答ありがとうございます 早速テストしてみましたが判定出来ませんでした 下記がエラーメッセージです moji:Undefined variable. +-*/を受け付けないようです 正規表現とif文ご指摘有難う御座います以後改めさせて頂きます お時間があればで宜しいのですがnotnotさんでしたらbashでどのように書かれますか?

関連するQ&A

  • UNIX Cシェルで実数の比較

    UNIX Cシェルで実数の比較がしたいのですが、 うまくいきません 以下のような結果になります。 うまく判定するにはどうすればよいのでしょう #!/bin/csh -f set CONSIZE=-0.01 echo "CONSIZE = $CONSIZE" @ CONSIZE = $CONSIZE if( $CONSIZE < 0.0 )then echo " 0以下;;; $CONSIZE" exit endif 実行 CONSIZE = -0.01 @: 数値形式が正しくありません。

  • Cシェルでの文字列大小比較

    Cシェルで set AA="aa" set BB="bb" if( $AA > $BB )then echo "$AA > $BB" endif というような判定がしたいのですが、 上記の場合、”if: 条件式構文が正しくありません”というエラーが出力されます。 Cシェルの場合、文字列の比較は ifでイコールかノットイコールかは判定できますが、文字コードの大小比較が出来ないようですが、 文字列の大小比較をするにはどうすればよいのしょうか

  • シェルの配列

    シェルで2つの配列の同じ位置の文字を同時にチェックしようとして以下のコードを組みましたが、上手くいきません。$dd中の文字が配列として扱われていないのはなぜだか教えていただけますか? #! /bin/csh -f set AA="18" set BB="20" set cc = "11 12 18 19" set dd = "24 22 20 21" @ idx = 1 foreach h_code ( $cc ) echo [$AA][$h_code][$BB][$dd[$idx]]     # ccの1個目とddの1個目をそれぞれ$AA,$BBと比較 if( $AA == $h_code && $BB == $dd[$idx] ) then echo "OK" endif @ idx++ end

  • シェルプログラムの判定で困っています

    皆さんのお知恵をお貸しください 環境はtcsh irixです 目的 set name = $<で$nameに入る文字を判定、検索したい 検索除外文字 -(マイナス) .(ピリオド、少数点) 数字 除外文字以外が入った時にエラーを出したいのですが、どう判定よいのか? 以上よろしくお願い致します。

  • シェルについて

    Linuxにパッケージをインストールした後に、パッケージがちゃんとインストールされているかと確認するというrpmcheck.shを下記に作成したのですが、実行環境がなく、下記に自分で記述したシェルが動作するかわかりません。どなたか、実行が可能か教えてください。 ---------------------------------------------------------------- #!/bin/sh PKG_NAME=`rpm -qa | grep -e PAKAGEinst grep -e ABCnv` echo $PKG_NAME if [ $PKG_NAME = PAKAGEinst,ABCnv ] ; then echo "パッケージはすべてインストールされました!" else echo "パッケージが足りません!" fi ---------------------------------------------------------------- こんな感じで、記述したのですが、UNIX系OSに触れていないので、よくわからないです。どのたか、アドバイスをお願いします。

  • シェルでファイルが2Gを超えているかの判定は?

    posix shでファイルが2Gを超えているかの判定を行いたいです。 size=`ls -l FILE | awk '{printf $5}'` if [ $size > 2147483648 ] then echo "2G超え" fi で、出来るかと思いましたがシェルではこのif文が行えません。 全然違う方法でいいのですが なんとかファイルサイズが2G超えか判定する方法は ありますでしょうか?

  • Kシェルでgotoのような処理を作成したい。

    Kシェルでgotoのような処理を作成したい。 以下のような処理で、入力した文字が条件と一致しなかった場合、 再度、入力からやり直させるようにしたいです。 以下が例です。 NGになった場合、再入力を促したいです。 #!/bin/ksh echo "Input Moji ---> \c" read ans_Moji if [ ${ans_Moji == "入力した文字" ] ; then echo "OK" else echo "NG"  fi Windowsのようにgoto文があれば、簡単に出来るのですが、 シェルをはじめたばっかりでよく分かっておりません。 何かご存知でしたら、ご教授願います。

  • cshの条件式について教えてください

    cshで該当ディレクトリにファイルがなければOK、あればエラーというような処理をしようと思っています。 しかし、下記のような記述ではうまくできません。 1) *************************** if ( -e $DIR/*.* ) then echo "NG" exit 1 else echo "OK" endif exit 0 *************************** if文でなく、外にだせばうまくいくのですが... 2) *************************** test -e $DIR/*.* if($status == 0) then echo "NG" exit 1 else echo "OK" endif exit 0 **************************** if ( test -e $DIR/*.* ) then... でもだめでした。 どうにかしてif文で一発判定をしたいと思っているのですが、正しい記述方法を教えてください。 よろしくお願いします。

  • シェルの変数の動作についての質問

    solaris8上で、シェルから別のシェルを子プロセスを動作させて その子プロセスが終了したかを判定するシェルを作成しました。 そのシェルの抜粋は下記のようになっています。 ---------------------------------------------------- "コマンド実行" & PID=$! i=0 ERR_FLG=1 echo " PID="$PID >> tmp.txt   ・・・・(1) while [ 1 ] do   if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then     ERR_FLG=0     break   fi   "終了条件を満たしたかを確認するサブルーチン"   if [ $? -eq 1 ]; then     echo "Time out" >> tmp.txt     break   fi   i=`expr $i + 1 `   sleep 10 done echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2) ---------------------------------------------------- 殆どの場合問題なく動作しているのですが、 ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。 当然サブルーチン上で、PIDを書換する処理もありません。 どのような状況の時に、現象が起きるかもはっきりしていません。 この現象の回避方法が判る方がおられましたら御教示の程、 宜しくお願いします。

  • シェルについて

    以下のような「プロセスをkillするシェル」を作成しています。 そこで質問なのですが、プロセスが死んだら繰り返しを抜ける ようにしたいと考えているのですが、どのようにすれば実現できるのか 分かりません。 どなたかご存知の方がいらっしゃれば教えていただきたいです。 申し訳ありませんが、宜しくお願いいたします。 #!/bin/csh # 変数定義 set cnt = 3 #リトライカウンタ set i = 1 # ループカウンタ #aaaをkill while ( $i <= $cnt ) ps -ef | grep -v grep | grep aaa | \ nawk '{if(match($NF,"aaa") == 1){system("kill " $2);print "kill: " $2}}' ps -ef | grep -v grep | grep aaa| \ nawk '{if(match($NF,"aaa") == 1){system("kill -9 " $2);print "kill: " $2}}' @ i = $i + 1 end

専門家に質問してみよう