Bash Shell执行算术操作

你需要在 shell 脚本中执行一些简单的算术操作

解决方案

$(()) 或 let 进行整数运算。例如:

COUNT=$((COUNT + 5 + MAX * 2))
let COUNT+='5+MAX*2'

讨论

只要都是整数运算,就可以在 $(()) 的算术表达式内使用所有的标准(与 C 语言类似)运算符。这里还有一个额外的运算符:可以用 ** 进行幂运算,如 MAX=$((2**8)),结果为 256。

$(()) 表达式内不需要使用空格,不过在运算符和操作数两边加上空格也无妨(但 ** 必须写在一起)。但是 = 两边绝不能出现空格,这和 bash 变量赋值的规则一样。另外,确保给 let 的表达式加上引号,因为 let 语句是 bash 内建的,其参数要经过单词扩展。

不要在赋值号(=)两边放置空格!如果你按以下方式写:

COUNT = $((COUNT+5))    # 可不像你想的那样!

那么,bash 会尝试运行一个名为 COUNT 的程序,其第一个参数为 =,第二个参数为 $COUNT 与 5 之和。记住,别在赋值号两边加空格!

另一个怪异之处是,通常出现在 shell 变量前表示取值的 $ 符号(如 $COUNT$MAX)在双括号内部是不需要的。例如,我们可以写:

$((COUNT + 5 + MAX * 2))

在上述示例中,shell 变量前并没有 $ 符号,实际上,外部的 $ 应用于整个表达式。但如果用到了位置参数(如 $2),那么 $ 还是少不了的,因为只有这样才能区分位置参数与数字常量(如 2)。以下是一个示例。

COUNT=$((COUNT + $2 + OFFSET))

用 bash 内建的 let 语句对 shell 变量执行整数运算时,也涉及类似的问题。let 用到的算术运算符和 $(()) 一样。

let COUNT=COUNT+5

其中有一些花哨的赋值运算符可供使用,如下所示(它将完成与前一行相同的操作)。

let COUNT+=5

(C/C++ 和 Java 程序员应该不会陌生。)这个示例给变量 COUNT 的现有值加 5,而且不需要重复书写变量名。

下表列出了这些特殊的赋值运算符。

Bash Shell执行算术操作

这些赋值操作符也可以在 $(()) 内使用。最外层的赋值仍旧是普通的 shell 变量赋值。

也可以用逗号运算符形成级联赋值。

echo $(( X+=5 , Y*=3 ))

该表达式执行两次赋值操作,然后由 echo 显示出第二个子表达式的结果(因为逗号运算符返回其第二个操作数的值)。如果不想显示结果,更常见的做法是使用 let 语句。

let   X+=5 Y*=3

这里不需要逗号运算符,因为 let 语句中的每个单词本身就代表单独的算术表达式。

let 语句和 $(()) 语法的另一处重要区别在于两者处理空白字符(空格字符)的方式不同。对 let 语句来说,要么添加引号,要么赋值运算符(=)和其他运算符两边不能出现空格。必须将运算符和操作数放在一起形成一个单词。以下两种写法都没问题。

let i=2+2
let "i = 2 + 2"

$(()) 语法就宽松多了,它允许各种空白字符出现在双括号内。这种写法不易出错,代码的可读性也要好得多,是我们执行 bash 整数运算时的首选方式。偶尔用到 += 赋值或 ++ 运算符,抑或是怀念早期的 BASIC 编程(该语言也有 LET 语句)时,也会存在例外。

记住,这是整数运算,不是浮点运算。别对 2/3 这样的表达式抱太大希望,它在整数运算中的计算结果为 0。除法是整数除法,它会舍去任何小数结果。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!