使用 expr 将两个数字相加

Isu*_*uru 15 shell-script

我正在学习 Shell 脚本以获得我目前正在做的 IT 文凭。我正在尝试编写一个小脚本,将两个数字相加,如我们获得的教程之一所示。

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"
Run Code Online (Sandbox Code Playgroud)

但是,当我给它执行权限并运行脚本时,它给了我这个错误。

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我尝试在 Ubuntu 和 Fedora 上运行它,但发生了同样的错误。谁能告诉我我在这里缺少什么?

Ulr*_*gel 44

首先,您必须摆脱分配的空间,例如

sum='expr $num1 + $num2'
Run Code Online (Sandbox Code Playgroud)

那么你必须改为'a`甚至更好$()

sum=$(expr "$num1" + "$num2")
Run Code Online (Sandbox Code Playgroud)

expr您也可以直接在 shell 中进行计算,而不是使用:

sum=$((num1 + num2))
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 `expr` 而不是 `$((...))` 的动机是希望可移植到经典的 Bourne shell,那么避免使用 `$(...)` 也是一个好主意。 (3认同)
  • @AlanCurry 是否有不支持 `$()` 的 shell?据我所知,posix 需要它,例如所有 posix 兼容的 shell 都应该支持`$()` (2认同)
  • @UlrichDangel 最初的 Bourne shell 没有 `$(...)`,但它已经消失了(也许某个地方的某个人仍在 Solaris 上运行 `/bin/sh`)。 (2认同)

jas*_*yan 9

您可能将反引号误读为该行中的单引号:

sum = 'expr $num1 + $num2'
Run Code Online (Sandbox Code Playgroud)

请参阅Greg 的 Wiki来使用$(...)

这按预期工作:

sum=$(expr "$num1" + "$num2")
Run Code Online (Sandbox Code Playgroud)

另请注意,等号(变量赋值)周围没有间隙。