在Korn Shell中无限循环

时间:2017-09-20 10:23:48

标签: shell while-loop ksh

我有以下代码:

#!/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" ]表示"而$opt为空"如果你想知道。

这是输出:

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时循环?

编辑: 我在while循环中添加了echo $opt,然后打印出来:

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

所以$ opt按原样接收了用户输入,但仍然没有中断。

2 个答案:

答案 0 :(得分:1)

您可能希望使用更清晰的if表达式来避免多个case条件:

#!/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"

如我的回答所示,在$opt内引用[ ... ]也很重要。

答案 1 :(得分:1)

无论$ opt有什么价值,

[ $opt != "1" ] || [ $opt != "2" ] 始终都是真的。

因此,行为是正常的。