Linux Shell脚本中的逻辑错误

时间:2013-12-13 22:50:58

标签: linux shell logical-operators

输入“退出”“q”“退出”或“x”时需要退出的简单计算器。在这种情况下需要改变什么?

echo -n "Enter Number Operator Number [exit/quit if finished]"
read num1 op num2

if [[ "${num1,,}" =~ "quit" | "q" ]] || [[ "${num2,,}" =~ "exit" | "x" ]]
then
    echo -e "\nExiting `basename $0`, Goodbye!\n"
    exit 0
fi

2 个答案:

答案 0 :(得分:2)

你误解了“或”意味着什么。它不是一个或在不同的值之间,而是在不同的逻辑条件之间。

我认为这就是你想要的:

[[ $num1 =~ "quit" || $num1 =~ "q" || $num2 =~ "exit" || $num2 =~ "x" ]]

答案 1 :(得分:1)

if [[ ${num1,,} =~ (quit|q|exit|x) ]]

=~超过正则相等的特殊功能是将右侧表达式解释为扩展正则表达式。 (quit|q|exit|x)是一个表达式,表示任何匹配“退出”或“q”或“退出”或“x”的文本。

请注意,功能[[=~需要像bash这样的高级shell。普通/bin/sh可能没有这些功能。

如果您想要更高的兼容性,有两种选择。一个使用[(测试)语句:

num1="$(echo $num1 | tr '[:upper:]' '[:lower:]')"
if [ "${num1}" = quit -o  "${num1}" = q -o  "${num1}" = exit -o  "${num1}" = quit -o  "${num1}" = x ]

上面的表达式更长,因为我们仅限于简单的相等测试。 -o[的“或”运算符。

另一个选项使用case语句:

num1="$(echo $num1 | tr '[:upper:]' '[:lower:]')"
case "${num1}" in
    quit|q|exit|x)
        echo ""
        echo "Exiting `basename $0`, Goodbye!"
        echo ""
        exit 0
        ;;
esac

简单shell没有${var,,}功能,但如上所示,tr(翻译)实用程序可以进行大小写转换。

另请注意,在上一个示例中,我已使用三个简单的echo -e语句替换了echo。这是因为许多shell不支持-e的{​​{1}}选项。