逗号运算符在 Bash 算术中起什么作用?

逗号运算符在 Bash 算术中起什么作用?

在 Bash 手册中,第 6.5 节 Shell 算术

expr1 , expr2
comma

逗号运算符有什么作用?

expr1和 是expr2算术表达式吗?

答案1

,是一个列表运算符。

算术表达式列表将从左到右计算,最后一个表达式结果是返回值:

$ echo "$(( a=1, ++a, ++a ))"
3

列表,运算符已添加到 bash-2.04-devel 中(以及前/后递增/递减运算符)。

您可能想阅读expr.c看看其他操作符是如何实现的,以及功能expcomma()对于,操作员来说。

答案2

重击

逗号运算符在 bash ( LESS=+/'expr1 , expr2' man bash) 中有效:

expr1 , expr2
逗号

并且没有其他解释其用途。
为此我们必须阅读“C 语言”描述(所有算术运算符的诞生地)

示例(如上面的链接所示)(其中第二个的值为 5):

$ echo "$(( (t=3, t+2) )) $t"
5 3

或者,更简单:

$ echo "$(( t=3, t+2 )) $t"
5 3

是的,每个元素用逗号分隔可能是一个表达式:

1313    expression:
            assignment-expression
            expression , assignment-expression

POSIX

POSIX 确实不是包括一个逗号运算符:
表:选定的 ISO C 标准运算符和控制流关键字

或者尝试一下:

$  dash -c 'echo $(( t=3,t+2 ))'
dash: 1: arithmetic expression: expecting EOF: " t=3,t+2 "
$  bash -c 'echo $(( t=3,t+2 ))'
5

正如 IBM 在其报告中所证实的那样AIX 和 POSIX shell 页面(强调我的):

所有积分运算符,以外..., 和逗号 (,), 支持。

但是,同样在 AIX 中,IBM 声称支持逗号运算符来自 ksh93 shell/usr/bin/ksh93

可以使用更多算术运算符,包括一元 +、++、-- 和 ?: 构造(例如,“x ? y : z”)以及 ,(逗号)运算符。

结论:

dash, ksh   do not have a comma operator.
ksh93          may have a comma operator.
bash, zsh   do     have a comma operator.

相关内容