为什么$((40-35))会变成5?

为什么$((40-35))会变成5?

背后隐藏着什么样奇怪的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))打印4whilea=2+2; echo $((a))是一个错误(但无论如何在某些 shell 上打印 4)。

$((决定是开始命令替换($(command)命令恰好以左括号开头)还是算术表达式 ( )的确切规则$((expression))因 shell 而异。如果要执行命令替换并且命令以 开头(,请添加一个空格以确保安全:($( (echo hello))此类命令很少见,这就是为什么可以添加语法而不会产生任何实际混淆危险)。

相关内容