- ベストアンサー
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 は使えません。
- みんなの回答 (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" = "" ] が普通です。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
if [ AB = ] ; then continue fi の if の判定を [ "x$AB" = "x" ] とか [ -z "$AB" ] にする。
お礼
おお、早速のご返答ありがとうございます。 月曜日に試してみますね。
お礼
変数名に ”” を入れるんですね。 これは大変ありがち指摘です。 ありがとうございます。 if でのやり方を教えてくださってありがとうございます。 case ばかりだと困っちゃうので。 月曜日に試してみます。 ありがとうございました。