我正在为一个类制作一个脚本,该脚本应该要求您输入两个整数,然后要求您选择 a / s / m / d 进行加、减、乘或除。它还将确保您输入了一个整数和一个有效的选项,但我稍后会处理这个问题。现在这是我所拥有的:
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
if [ "$func" -eq "a" ]; then
echo $((num1 + num2))
fi
if [ "$func" -eq "s" ]; then
echo $((num1 - num2))
fi
if [ "$func" -eq "m" ]; then
echo $((num1 * num2))
fi
if [ "$func" -eq "d" ]; then
echo $((num1 / num2))
fi
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
当我运行它时,它会正确要求内容,但我收到了我不理解的错误:
./MathTest.sh: line 9: [: a: integer expression expected
./MathTest.sh: line 13: [: a: integer expression expected
./MathTest.sh: line 17: [: a: integer expression expected
./MathTest.sh: line 21: [: a: integer expression expected
./MathTest.sh: line 25: syntax error near unexpected token `else'
./MathTest.sh: line 25: `else'
请有人帮我解决这个问题吗?
答案1
您需要使用字符串比较 (
=
) 而不是整数比较 (eq
)。你的脚本中的语句
else
没有对应的if
语句。如果您想要执行一系列 if/then/else if/then/.../else 语句,则需要使用if ... elif ... elif .... else ... fi
... 而不是if ... fi; if ... fi; if ... fi; else
或者使用一个case
声明。如果不明显,
elif
则表示else if
.例如:
#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func
case "$func" in
a) echo $((num1 + num2)) ;;
s) echo $((num1 - num2)) ;;
m) echo $((num1 * num2)) ;;
d) echo $((num1 / num2)) ;;
*) echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide" ;;
esac
请注意,每种情况的代码都需要以两个分号结尾;;
- 这是因为每种情况可以有多个代码语句(用换行符或单个分号分隔),因此 shell 解释器需要某种方式来区分另一个情况该案例的声明和案例的结束,以及;;
它用于执行此操作的内容。
一个简单的示例,显示每个案例两个语句:
case "$func" in
a) echo "addition:" ; echo $((num1 + num2)) ;;
s) echo "subtraction:" ; echo $((num1 - num2)) ;;
...
esac
您可以使用 if/elif/else/fi代替case
语句(在我看来,这可以使代码更具可读性 - 当然也更短,重复性更少),您可以使用 if/elif/else/fi ,如下所示:
if [ "$func" = "a" ]; then
echo $((num1 + num2))
elif [ "$func" = "s" ]; then
echo $((num1 - num2))
elif [ "$func" = "m" ]; then
echo $((num1 * num2))
elif [ "$func" = "d" ]; then
echo $((num1 / num2))
else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi
请注意,这是使用=
而不是-eq
进行比较(因为它是比较字符串,而不是数字),并且它是一长串 if、elif、elif、elif、else、fi 语句,而不是单个 if ... fi 语句。
顺便说一句,if/elif/fi 链和多个 if ... fi 语句之间有一个非常重要的区别。对于 if/elif/elif/elif/.../else/fi,只有第一的true 结果将永远执行(如果没有一个为 true,则执行 else 代码),并且 shell 将跳到整个链的末尾,类似于语句的case ... esac
工作方式。
对于多个if ... fi
语句,将依次评估每个语句,并且将执行每个评估为 true 的语句,独立于所有其他测试。