• ベストアンサー

Bshell 選択肢で ENTER のみを押したとき、エラー終了を回避するには?

[ 目的 ] 選択肢でENTERのみ押しても終了しないようにする 会社のUNIX 上で Bourne shell でプログラミングをしています。 表題のとおり、選択肢で ENTER のみを押して、条件分岐(if)に入ると 「引数が足りません。」 となって終了してしまいます。 この異常終了を回避するにはどうしたらよいのでしょうか? 例) while : do echo " A ・・・ 0 " echo " B ・・・ 9 " read AB if [ AB = ] ; then continue fi done sh -x ファイル名 で調べると、 S#(引数の総数) では引数が1になっています。0を押しても1、何も押さなくても1です。例のコマンドでは、ENTERだけ押した場合はcontinue がききますが、その他の入力(0,9)がエラーを起こします。case 文を使えば、問題は回避されるのですが、後で読む人のためにもif文で書きたいところです。Cshell ではこういう問題は起きません。bash は使えません。

質問者が選んだベストアンサー

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

空かどうかの判断だけじゃなくて、0か?とか9か?の判断もするんですよね?そうれあれば、caseを使うのが普通です。あとで読む人もわかりやすいです。 read AB case "$AB" in 0) ......... ;; 9) ......... ;; *) continue ;; esac どうしてもifでやるなら、 read AB if [ "$AB" = 0 ];then .... elif [ "$AB" = 9 ];then .... else continue fi ですね。readで読んだ変数ABの値を使うときは、必ず "$AB" と引用符で囲みます。空かもしれないし、特殊文字が入っているかもしれないからです。 #1の方が、 [ "x$AB" = "x" ] と書いてますが、これは、 [ "$AB" = "" ] が普通です。

scorpio
質問者

お礼

変数名に ”” を入れるんですね。 これは大変ありがち指摘です。 ありがとうございます。 if でのやり方を教えてくださってありがとうございます。 case ばかりだと困っちゃうので。 月曜日に試してみます。 ありがとうございました。

その他の回答 (1)

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

if [ AB = ] ; then continue fi の if の判定を [ "x$AB" = "x" ] とか [ -z "$AB" ] にする。

scorpio
質問者

お礼

おお、早速のご返答ありがとうございます。 月曜日に試してみますね。

関連するQ&A

  • enterでループ終了

    #include <stdio.h> int main(void) { char str[255]; int i, len; while (1){ printf("文字列を入力してください:"); if (fgets(str, sizeof(str), stdin) == NULL) { break; } len = strlen(str); if (len > 0 && str[len - 1] == '\n') str[len - 1] = '\0'; if (str[0] == '\0') break; enterで終了するプログラムの例ですが、 if (fgets(str, sizeof(str), stdin) == NULL) のNULLはどういった理由で必要ですか? また、 if (len > 0 && str[len - 1] == '\n') str[len - 1] = '\0'; を消して、 if (str[0] == '\0') break; を、if (str[0] == '\n') break; と書き換えれば、終了すのではないですか?不適な理由がありますか?

  • bashのif文で構文エラー:

    bashで時間の比較によっての分岐を考えています。 ネットで検索しながらif構文を下記のようにしてみているのですが、 行 10: 構文エラー: 予期しないファイル終了 (EOF) です となってしまいます。 どなた様かお教え願えませんでしょうか #!/bin/bash DATA=`date +%-H%M` if [ $DATA -gt 600 ];then echo "$DATA" else echo "NG" fi 

  • bashの関数の引数にスペースが入るとズレる件

    bashの関数の引数にスペースが入るとズレる件 bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。 これを回避する方法はありませんか? ■aaa.sh-Top #!/bin/bash declare FuncPara1 declare FuncPara2 function f_echo() { echo 'uf_echo1='$1 echo 'uf_echo2='$2 echo 'uf_echo3='$3 } echo '---test1---' FuncPara1='aaabbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} echo '---test2---' FuncPara1='aaa bbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} ■aaa.sh-Bottom ■aaa.shの実行 # ./aaa.sh ---test1--- uf_echo1=aaabbb uf_echo2=ccc uf_echo3= ---test2--- uf_echo1=aaa uf_echo2=bbb uf_echo3=ccc このtest2の時に、 ---test2--- uf_echo1=aaa bbb uf_echo2=ccc uf_echo3= となって欲しい。 もしくは、何かしら「なったテイ」で、 引数1の値は「aaa bbb」 引数2の値は「ccc」 と関数側で判断できる方法はありませんか?

  • bashファイル作成について

    shellについて初めて勉強しています。 乱数によってサイコロを3個表示する bashのファイルを作成しているのですが, なかなかうまくいきません。 どのようにしたらよいでしょうか? if文またはcase文を用いる必要があるのは想像できるのですが, 具体的にどう書けばいいのかよくわかりません。 たぶんある数を6で割った余りは0~5になるようにすればよいのではないかと思っています。 #!/bin/bash この続きをよろしくおねがいします。

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • UNIX

    UNIXの課題をやっていて、ここまで出来たのですが???の部分が 分かりません;誰か教えて頂けると助かります; 時間があれば説明も加えて頂けたら幸いです; #!/bin/bash #ふたつの引数の大小を判断し表示するシェルスクリプト if [ $# -lt 2 ] then echo "引数が足りません" exit fi cmp1=$1 cmp2=$2 if [ $cmp1 -gt $cmp2 ] then echo "$cmp1 ??? $cmp2" elif [ $cmp1 ??? $cmp2 ] then echo "$cmp1 = $cmp2" else echo "$cmp1 ??? $cmp2" fi

  • シェルスクリプトbashについての質問

    シェルスクリプトbashについての質問 #!/bin/bash function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } QUIZ01 QUIZ02 要件として トップ画面で選択肢 1.クイズ開始 2.アプリについて 3.アプリ終了 4.クイズ正解率 クイズを開始したら、 クイズは全5問で3問不正解でアプリを終了 問題の画面には現在の成果率が表示される 問題文は外部ファイルとする 問題の出現方法はランダムとして、問題は重複しない どうか教えてくださいお願いします

  • VBでContinueを使うには?

    VBScriptでContinueが出来ないときと出来るときがあって困っています。 Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows If TypeName(objWindow.Document) <> "HTMLDocument" Then Continue End If こういったコードがあるのですがContinueでエラーが出たり出なかったりします。 自分の開発機ではでないのですが、配ったプログラムの使用者では出たり出なかったりします。 何がいけないのでしょうか? 回避策を探しているのですがどうしたらいいかわかりません。

  • Linuxについて

    Linuxのスクリプトについて Linuxのスクリプトについての質問です #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done という引数に応じてカレンダーを出力するスクリプトを作成しました。 このスクリプトは引数が2つの場合は、1年ごとのカレンダーが表示されます。 ここに、引数が2つより少ないときはエラーメッセージを出力してプログラムを終了する機能をつけたいのですが 方法がよくわかりません。 #!/bin/bash # 実行時に指定された引数の数、つまり変数 $# の値が 3 でなければエラー終了。 if [ $# -ne 3 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには3個の引数が必要です。" 1>&2 exit 1 fi # ヒアドキュメントでメッセージを表示する。 cat <<__EOT__ 指定された引数は、 $1 $2 $3 の$#個です。 __EOT__ exit 0 このスクリプトをなんとか応用すればできると思うのですが なにせ初心者なもので;; ちょっと複雑になるとすぐに頭が混乱してしまう所存です・・・ どなたかご親切な方のご回答をお待ちしています。

  • バッチファイルで複数のレジストリを上書き

    バッチファイルの記述方法が分かりません。 あまり詳しくないため、どなたか分かりやすく教えてください。 【利用環境】 Windows 7 Enterprise 64bit 【やりたいこと】 ・バッチファイルとレジストリファイルをUSBメモリ内に忍ばせておく ・レジストリファイルは言語ごとにフォルダ分けしてある ・フォルダ内には4つのレジストリファイルがある ・1~4選択式にする  例:日本語の場合は"2"を選択する ・Enterを押すと、4つのレジストリが上書きされる。 ------------------------------------------------------------ @echo off echo ************ Add-ins Language Setting ************ echo [1] :  英語 / 英文 / English echo [2] : 日本語 / 日文 / Japanese echo [3] : 中国語 / 中文 / Chinese echo [4] : 韓国語 / 韓文 / Korean echo ***************************************************** set /p NUM="Please choose language >" if"%NUM%"=="1" if"%NUM%"=="2" if"%NUM%"=="3" if"%NUM%"=="4" ------------------------------------------------------------ 色々調べてみたのですが、if"%NUM%"=="1"の後にどのような記述をすれば良いか分かりません。 また、この書き方でやりたいことができるかさえ分かっていません。 もし何か良い方法があれば是非教えてください! 宜しくお願いします。

専門家に質問してみよう