背后隐藏着什么样奇怪的shell语法$((40-35))
,它是如何计算出一个值的?
例子:
$> echo $((40-35))
5
答案1
从bash
手册页:
((expression)) The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expres- sion is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".
并进一步:
Arithmetic Expansion Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is: $((expression))
任何放入双括号中的内容都会成为一个bash
可以计算的数学表达式。
答案2
这是算术展开。所有 POSIX shell 都支持它(原始 Bourne shell 中不存在)。算术表达式的语法与C语言基本相同。
您可以$
在算术表达式中使用带或不带 a 的变量。如果没有 a $
,变量就代表变量,并且特别可以被赋值给;例如echo $((a=4)) $a
打印4 4
。使用$
,shell 执行简单的文本扩展;例如a=2+2; echo $(($a))
打印4
whilea=2+2; echo $((a))
是一个错误(但无论如何在某些 shell 上打印 4)。
$((
决定是开始命令替换($(command)
命令恰好以左括号开头)还是算术表达式 ( )的确切规则$((expression))
因 shell 而异。如果要执行命令替换并且命令以 开头(
,请添加一个空格以确保安全:($( (echo hello))
此类命令很少见,这就是为什么可以添加语法而不会产生任何实际混淆危险)。