ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3970199 シェルプログラムの判定について
質問者:hks2 皆さんのお知恵をお貸しください
シェルは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

+-*/が入った時にエラーを出したいのですが+-*/をどう判定したらよいのか教えて頂けます様お願い致します。
困り度:
  • 困っています
質問投稿日時:
08/04/23 17:13
最新から表示回答順に表示

回答

ANo.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
回答者:sakusaker7
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/04/25 16:32
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答有難う御座います
うまく判別出来ました
bashですね
bashも勉強したくなりました。

回答

ANo.3 「grep から if」のところを「if test」にする... くらいしか思い付かない. 変数は 1個減るけど.
回答者:Tacosan
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/04/25 12:52
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答有難う御座います
testですか思いつきませんでした
早速試させて頂きます。

回答

ANo.2 >moji:Undefined variable.

変数が未定義というエラーなので、99% タイプミスが原因です。

>bashでどのように書かれますか?

薦めておいて申し訳ないですが、このケースだと、わかりやすく書くと大差ないものしか思い浮かびません。
回答者:notnot
種類:回答
どんな人:一般人
自信:自信あり
回答日時:
08/04/24 22:04
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答有難う御座います
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等
現状数字の矛盾は回避できたのですが+-*/が回避できません
改めて皆様のお知恵をお借りできれば幸いです。

回答

ANo.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

あと正規表現の '[\-\+\*\/]' はエラーではないですが、普通は '[-+*/]' と書きます。マイナスは範囲指定と見なされないように先頭か末尾の必要あり。
回答者:notnot
種類:回答
どんな人:一般人
自信:自信あり
回答日時:
08/04/23 23:41
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答ありがとうございます
早速テストしてみましたが判定出来ませんでした
下記がエラーメッセージです
moji:Undefined variable.
+-*/を受け付けないようです
正規表現とif文ご指摘有難う御座います以後改めさせて頂きます
お時間があればで宜しいのですがnotnotさんでしたらbashでどのように書かれますか?
最新から表示回答順に表示