下一阶段应该检查输入的数字是否确实是数字,或者退出脚本并要求输入数字。该代码在 ShellCheck 中看起来没问题(没有错误),但无论输入什么内容,它都会认为您没有输入数字,并且会终止脚本(好消息,退出有效)。
#!/bin/bash
echo "Please input a whole number"
read -r num1
if [ "$num1" = [0-9] ]; then
echo "Please input another whole number"
read -r num2;
else
echo "Please enter a whole number only";
exit
fi
if [ "$num2" = 0-9 ]; then
echo "Please input function: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide";
read -r func
else
echo "Please enter whole number only"
exit
fi
if [ "$func" = "a" ]; then
echo "The sum of the two numbers is " $((num1 + num2))
elif [ "$func" = "s" ]; then
echo "The difference of the two numbers is " $((num1 - num2))
elif [ "$func" = "m" ]; then
echo "The product of the two numbers is "$((num1 * num2))
elif [ "$func" = "d" ]; then
echo "The quotient is (part of answer here) with a whole number remainder of (answer her) "$((num1 / num2))
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi
答案1
您尝试使用相等运算符来匹配正则表达式=
,但这是行不通的。您还使用了[
它不支持正则表达式比较,您需要使用它[[ ... ]]
。即使代码的其余部分有效,您尝试的正则表达式也会匹配包含至少一位数字的任何字符串(即它不仅会匹配类似的数字123
,而且会匹配类似的非数字abc123xyz
)
尝试这样的事情num1
:
while read -p 'Please input a whole number: ' -r num1 ; do
if [[ $num1 =~ ^[0-9]+$ ]] ; then
break
else
echo "Invalid input, try again."
fi
done
并为 做类似的事情num2
。也许与func
正则表达式一起使用^[asmd]$
。
这将永远循环,直到循环内的某些内容(即与^[0-9]$
正则表达式成功匹配)退出循环(即执行break
)。
或者,稍微短一点:
while read -p 'Please input a whole number: ' -r num1 ; do
[[ $num1 =~ ^[0-9]+$ ]] && break || echo "Invalid input, try again."
done
test-something && what-to-do-if-true || what-to-do-if-false
当您不想if/then/else/fi
为简单测试键入完整的构造时,这是一个方便的快捷方式。您可以在 if/then/else/fi 中执行更多操作,但是当您只需要在成功或失败时执行一件事时,这很有用。顺便说一句,该|| what-to-do-if-false
部分是可选的,并且还有其他几种可以使用它的变体方式。
请注意,您运行的每个命令都将以零(真/成功)或非零(假/失败/错误)退出代码退出。非零退出代码的范围从 1 到 255,可以指示错误类型(有一些常用的退出代码,例如“文件未找到”或“访问被拒绝”等,但退出代码及其含义主要取决于正在运行的程序)。因此,您可以使用这个简短的条件测试来确保只有前一个命令成功时才执行一个命令。例如
cd mydir && rm myfile
或者
grep -q regex file.txt || mv file.txt /some/directory/
仅当成功时才会rm
执行cd
,并且file.txt
仅在成功时才会被移动不包含regex
。