输入“退出”“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
答案 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}}选项。