我有以下代码:
#!/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按原样接收了用户输入,但仍然没有中断。
答案 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 != "1" ] || [ $opt != "2" ]
始终都是真的。
因此,行为是正常的。