Unix Calculator.bash 有问题

Unix Calculator.bash 有问题

这是我为在 Unix 中计算数字而编写的 bash 脚本:

echo "Please enter the calculation(operation) type (+)(-)(*)(/)"
        read $opr
echo "Enter the first number"
        read $num1
echo "Enter the second number"
        read $num2
if [[ $opr = "+" ]]; then
        num=$(($num1 + $num2))
                echo "The sum is = $num"
elif [[ $opr = "-" ]]; then
        num=$(($num1 - $num2))
                echo "The sum is = $num"
elif [[ $opr = "*" ]]; then
        num=$(($num1 * $num2))
                echo "The sum is = $num"
elif [[ $opr = "/" ]]; then
        num=$(($num1 / $num2))
                echo "The sum is = $num"
fi

它运行,但输出“The sum is =”,并且不给出数字。您能看到导致此问题的原因吗?

答案1

看来您当前通过 获取输入的方式read是错误的,因此根本没有进行数学计算,因此您最终没有任何答案。您只需修复此方面,其余代码就应该可以工作。

如何阅读

原始发布代码的摘录显示您试图保存第一个数字,如下所示:

echo "Enter the first number"
        read $num1

相反,尝试使用-p提示符并命名不带美元符号的变量。您甚至可以在命令提示符上num测试以下内容,这样您就会看到:read -p ...

$ read -p "Enter the first number" num1
Enter the first number:

现在输入1:

$ read -p "Enter the first number" num1
Enter the first number: 1

现在,如果您这样做echo $num1,您将成功看到该值:

$ echo $num1
1
  • -p the_prompt_text是一种包含提示的方法
  • 与 相比echoecho在末尾添加一行 return。但既然-p没有,最好像我一样有一个额外的空格,请注意在冒号之后:,我有一个空格:"Enter the first number: "。这只是为了让用户的输入不会出现在冒号的右边。
  • 当指定要保存响应的变量时,读取的正确语法是不包含$,因此我们有read然后num1

因此,有了这个,您应该能够调整read脚本的各个部分并且它会正常工作。

答案2

用户454038赛勒斯正确描述了如何解决您的问题,但没有描述您做错了什么。$ 在您引用时使用的 shell 中(或至少在 bash 中)的价值一个变量,但当您引用变量本身时(即,当您环境价值)。这很令人困惑;在大多数(所有?)普通编程语言中,无论哪种方式都使用相同的语法。您似乎部分理解了这个概念;你说

num=$(($num1 + $num2))

而不是犯这样的常见错误

$num=$(($num1 + $num2))                                                (不要这样做!)

read也适用于该声明。当你说 时read $opr$opr会被扩展(即替换为当前的变量的值opr)——并且变量的当前值为opr空字符串。所以命令最终看起来像

read

你可能认为这是一个错误;事实上,它相当于read REPLY。所以,

$ 读取 $num1
17 号
$回显$num1
                                                                    (空行输出)
$回显$REPLY
17 号

这个例子可以更好地说明该机制:

$ superman=clark_kent
$ read $superman
man of steel
$ echo $superman
clark_kent
$ echo $clark_kent
man of steel

但你不应该做这样的事情(尤其是上面的例子),因为它们太神秘了;读者/维护者将很难理解代码的作用。

长话短说

您的read陈述应该是read opr, read num1, and read num2 (不带$s)。

相关内容