比较Bash中的字符串与逻辑或

时间:2014-05-26 19:13:28

标签: bash if-statement conditional

我在解决一个简单的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问题的最佳方式/最有效方法。

4 个答案:

答案 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