这是我为在 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
是一种包含提示的方法- 与 相比
echo
,echo
在末尾添加一行 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)。