Ubuntu 不计算 [..] 中的表达式?

jsw*_*xy1 3 scripts

我是 Linux 的新手。我正在阅读 Linux: Rute Users 这本书。一切都很好,直到我来到 7.1 单元。

我的脚本如下:

#!/bin/sh
echo "enter X"
read X
echo "enter Y"
read Y
echo "X*Y = $X*$Y = $[X*Y] = $[$X*$Y]"
Run Code Online (Sandbox Code Playgroud)

我的终端没有给我 X*Y = 2*3 = 6,而是打印

X*Y = 2*3 = $[X*Y] = $[2*3]
Run Code Online (Sandbox Code Playgroud)

我也直接在终端里试过命令:

echo "$[2*3]"
Run Code Online (Sandbox Code Playgroud)

它正确地给了我 6。

我的脚本有什么问题?我正在使用 Ubuntu 桌面 12.04 LTS 32 位。谢谢!

c0r*_*0rp 6

((...)) 条件表达式评估算术表达式,就像它是用“普通”算法语言编写的一样(您甚至可以从变量中省略美元符号),如果表达式的计算结果为 0,则将退出状态设置为 1,如果表达式的计算结果为非零值,则为 0。

在 bash 3.2 及更高版本中,您可以(并且应该)使用 $(())

这里引用

什么是bash?

Bash 继承自 Bourne Shell,是 GNU 产品,即“Bourne Again SHell”。它是大多数 Linux 机器上的标准命令行界面。它擅长交互性,支持命令行编辑、完成和调用。它还支持可配置的提示——大多数人意识到这一点,但不知道可以做多少。

您应该使用(( ))数学表达式:

echo "$(( 2*3 ))"
Run Code Online (Sandbox Code Playgroud)

或者

echo "$(( $X*$Y ))"
Run Code Online (Sandbox Code Playgroud)

甚至

echo "$(( X*Y ))"
Run Code Online (Sandbox Code Playgroud)

为什么echo $[..]在某些环境中也有效?

算术展开

算术扩展允许对算术表达式求值并替换结果。算术展开的格式为:

$((表达式))

旧格式 $[expression] 已弃用,并将在即将发布的 bash 版本中删除。