2017-09-20 19 views
1

私は次のコードを持っている:あなたは疑問に思う場合には「$optが空の間、」無限whileループのKornシェルで

#!/bin/ksh 
echo "1) Option 1" 
echo "2) Option 2" 
echo "3) Option 3" 
echo "4) Option 4" 

opt=0 
while [ x$opt = "x" ] || [ $opt != "1" ] || [ $opt != "2" ] || [ $opt != "3" ] || [ $opt != "4" ]; do 
     printf "Enter [1|2|3|4] : " 
     read -r opt 
done 

echo "Option selected : $opt 

while [ x$opt = "x" ]手段を。 OK、何か予期せぬ何かを入力しないとき

Will:/home/will> ./script.ksh 
Enter [1|2|3|4] : 
Enter [1|2|3|4] : jde 
Enter [1|2|3|4] : 1 
Enter [1|2|3|4] : 2 
Enter [1|2|3|4] : 3 
Enter [1|2|3|4] : 4 
Enter [1|2|3|4] : 

だから、それはループ:

は、ここでの出力です。 しかし、最後のechoメッセージを表示する必要があるときに、1/2と3と4が入力されたときに、なぜループしますか?

EDIT: 私は、whileループでecho $opt追加されている、そしてそれはこの私を出力します。

Enter [1/2/3/4] : d 
d 
Enter [1/2/3/4] : 1 
1 
Enter [1/2/3/4] : 

だから$ optが、それが必要として、ユーザの入力を受けたが、しばらくはまだ壊れることはありません。

答えて

1

あなたは非常にクリーンcase表現使用して、複数のif状態を回避することもできます。

#!/bin/ksh 

echo "1) Option 1" 
echo "2) Option 2" 
echo "3) Option 3" 
echo "4) Option 4" 

while true 
do 
    case $opt in 
    1|2|3|4) 
     break ;; 
    *) 
     printf "Enter [1|2|3|4] : " 
     read -r opt ;; 
    esac 
done 

echo "Option selected : $opt" 
あなたの問題について

、あなたが実際にチェックするために&&を使用する必要があり、条件間||を必要としませんがすべての否定的条件:

#!/bin/ksh 
echo "1) Option 1" 
echo "2) Option 2" 
echo "3) Option 3" 
echo "4) Option 4" 

opt= 
while [ "x$opt" = "x" ] && [ "$opt" != "1" ] && [ "$opt" != "2" ] && [ "$opt" != "3" ] && [ "$opt" != "4" ]; do 
     printf "Enter [1|2|3|4] : " 
     read -r opt 
done 

echo "Option selected : $opt" 

また、を引用することが重要です[ ... ]の中に私の答えで示されている。

+0

'||'の代わりに '&&'を使用すると、マイコードは ''選択された出力 ''オプションがすぐに存在します:0'。 '[" x $ opt "=" x "]'を削除すると動作しますが、この場合はユーザーが何も入力しないとスクリプトがクラッシュします – Will

+0

最新の編集済みの回答を確認してください。私は 'opt = 0'を単に' opt = 'に変更し、引用符も変更しました。 – anubhava

+0

私は引用符を追加し、 '$ opt'宣言から0を取り除いたところ、' ./t[7:test:argument expected':/ – Will

1

[ $opt != "1" ] || [ $opt != "2" ]いつもは$ optの値に関係なく真です。

したがって、動作は正常です。

関連する問題