shell-双重配额((..))到底是什么意思?

shell-双重配额((..))到底是什么意思?

我知道在 shell(bash) 中,可以在里面进行算术运算((..))

例如

i=1
((i++)) #i=1
((i+=1)) #i=3

我的问题是:

它到底((..))做了什么?它创建了一个匿名变量吗?

答案1

算术表达式语法 -

(( expression ))

根据算术求值中描述的规则对表达式进行求值。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于let "expression"

算术扩展允许计算算术表达式并替换结果。算术扩展的格式为:

$(( expression ))

该表达式被视为在双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都会经过参数和变量扩展、命令替换和引号删除。结果将被视为要评估的算术表达式。算术扩展可以嵌套。

将字符括在双引号中可保留引号内所有字符的字面值,但 $、\ 和启用历史扩展时的 ! 除外。字符 $ 和 ` 在双引号内保留其特殊含义。反斜杠仅在其后跟以下字符之一时保留其特殊含义:$、"、\ 或 。双引号可以在双引号内引用,方法是在其前面加上反斜杠。如果启用,除非使用反斜杠对双引号中出现的 ! 进行转义,否则将执行历史扩展。! 前面的反斜杠不会被删除。

参考

答案2

它允许计算数学表达式并替换结果

算术扩展允许计算算术表达式并替换结果。算术扩展的格式为:

$((表达式))

表达式被视为在双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都会经过参数扩展、字符串扩展、命令替换和引号删除。算术扩展可以嵌套。

求值按照下面算术求值中列出的规则进行。如果表达式无效,bash 将打印一条消息指示失败,并且不会发生替换。Bash 手册页

答案3

只是((..))告诉 shell 解释器你将进行算术运算。通常在 bash 中,你需要使用反引号`...`来进行算术运算。这是一种更像 C 的替代语法,允许 i++ 之类的东西将变量增加i1。堆栈溢出这很好地解释了这一点。

答案4

bash(不是在 POSIX shell 中)中,((表达))允许您进行算术评估。它与以下相同:

let "expression"

它不创建任何匿名变量,它在当前 shell 中评估表达式,影响当前 shell 上下文中的所有变量。如果表达式的值非零,则返回状态为 0,否则返回状态为 1。

请注意,((...))let是的功能,ksh并且仅在bashzsh和中可用ksh。您应该使用((..))超过,let因为它比使用更清晰且更易于引用let

为了便于携带,使用$((...))构造。

相关内容