【发布时间】:2019-04-12 03:22:45
【问题描述】:
我是 bash 脚本的新手,需要帮助。
我制作了需要比较用户输入的脚本(固定选择 045、046、287 或 279)。与其他值。
当用户输入 045 或 046 时,if 语句为真,应显示
您选择了 $SID。将使用菜单 1
如果用户输入 287 或 279 语句需要 false 并显示
您选择了 $SID。将使用菜单 2
$SID 是上面给出的用户输入。
if [ "$SID" == "046" -o "045" ] ; then
printf "You have choosen $SID. Menu 1 will be used"
else
printf "You have choosen $SID. Menu 2 will be used"
fi
但在运行脚本时,它总是显示真实的语句,用户输入显示在 $SID 位置。
You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
You have choosen 287. Menu 1 will be used
You have choosen 279. Menu 1 will be used
我的期望是这样的:
当使用 045 或 046 时:
You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
当使用 279 或 287 时:
You have choosen 287. Menu 2 will be used
You have choosen 279. Menu 2 will be used
我还尝试了以下 if 语句,但没有结果:
if [ $SID -eq 046 -o 045 ] ; then
if [ "$SID" -eq "046" -o "045" ] ; then
if [ $SID = 046 -o 045 ] ; then
if [ "$SID" = "046" -o "045" ] ; then
我错过了什么?
【问题讨论】:
-
[ "$SID" == "046" -o "$SID" == "045" ]这是正确的语法 -
它是
(expr) -o (expr),而不是operand operator (operand -o operand);在您的情况下,045被认为是正确的,因此条件始终为真,因为x -o true= true -
啊!太感谢了!在过去的几天里,我一直在为此头疼。现在完美运行!
-
请注意,在
[ ]中,您应该使用=而不是==(bash 可以同时理解这两者,但并非所有其他 shell 都可以;如果您指望 bash,您可以使用[[ ]]而不是[ ])。另外,请注意=(和==)在此上下文中进行字符串比较,因此如果用户输入“45”,则不等于“045”。在[ ]或[[ ]]中,使用-eq进行数值比较。实际上,“045”在数值上也不等于“45”,因为shell假定以“0”开头的数字是八进制,所以“045”在数值上等于“37”。是的,这很复杂。 -
最好假设 045 和 046 只是字符串文字,没有任何真正的数字含义。
标签: bash if-statement scripting compare