我知道在 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++ 之类的东西将变量增加i
1。堆栈溢出这很好地解释了这一点。