我在解决一个简单的y/n
问题时遇到了问题。请考虑以下代码:
echo "Hi there"
read ans
if [[ $ans != "y" || $ans != "Y" || $ans != "YES" || $ans != "yes" ]]; then
echo "Foo"
exit 0
fi
我已经看过了 - 我会争辩 - 在StackOverflow上提供一些更具信息性的答案:Simple logical operators in Bash
我尝试了所有不同类型的变体,例如:
if [[ ($ans != "y" || $ans != "Y" || $ans != "YES" || $ans != "yes") ]]; then
echo "Foo"
exit 0
fi
if [[ ($ans != "y*" || $ans != "Y*" || $ans != "YES*" || $ans != "yes*") ]]; then
echo "Foo"
exit 0
fi
if [[ ($ans != "y") || ($ans != "Y") || ($ans != "YES") || ($ans != "yes") ]]; then
echo "Foo"
exit 0
fi
无论我输入任何这些情况,它都会自动失败,我不知道为什么。如果有人有更好的方法处理y / n答案,请告诉我!理想情况下,我想使用模式匹配(就像我可能使用Perl一样),但我并不完全确定实现简单y/n
问题的最佳方式/最有效方法。
答案 0 :(得分:3)
您需要使用&&
代替||
。就目前而言,如果它不等于任何那些可能性,那么执行"然后"块。你的意思是说它是否不等于所有,然后执行"然后"块。这需要&&
。
答案 1 :(得分:3)
您可以使用:
echo "Hi there"
read ans
case "$ans" in
y|Y|YES|yes)
;;
*)
echo "Foo"
exit 0
;;
esac
答案 2 :(得分:2)
逻辑需要调整:
echo "Hi there"
read ans
if ! [[ "$ans" == "y" || "$ans" == "Y" || "$ans" == "YES" || "$ans" == "yes" ]]; then
echo "Foo" # User answered no
exit 0
fi
意志回应" Foo"只有答案是不" y"," Y"或"是"。相比之下,请考虑原始逻辑:
[[ $ans != "y" || $ans != "Y" || $ans != "YES" || $ans != "yes" ]]
无论用户的答案是什么,这些测试中至少有一个是真实的。
case
语句您可以考虑使用case
语句来分析用户的答案:
read -p "Hi there: " ans
case "$ans" in
[yY]*) ;;
[nN]*) echo "Foo" ; exit 0 ;;
*) echo "You were supposed to answer yes or no" ;;
esac
答案 3 :(得分:0)
尝试read ans
,而不是read $ans
。