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

Tim*_*Tim 4 shell bash arithmetic

在 Bash Manual, sec 6.5 Shell Arithmetic

expr1 , expr2
comma
Run Code Online (Sandbox Code Playgroud)

逗号运算符有什么作用?

expr1expr2算术表达式吗?

cuo*_*glm 8

, 是一个列表运算符。

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

$ echo "$(( a=1, ++a, ++a ))"
3
Run Code Online (Sandbox Code Playgroud)

,列表操作符是在bash-2.04-devel的增加(与前/后递增/递减运算)。

您可能需要阅读expr.c,看看其他经营者实施,功能expcomma(),操作。


小智 7

重击

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

expr1 , expr2
逗号

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

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

$ echo "$(( (t=3, t+2) )) $t"
5 3
Run Code Online (Sandbox Code Playgroud)

或者,更简单:

$ echo "$(( t=3, t+2 )) $t"
5 3
Run Code Online (Sandbox Code Playgroud)

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

1313    expression:
            assignment-expression
            expression , assignment-expression
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

正如 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.
Run Code Online (Sandbox Code Playgroud)

  • @Tim A,谢谢,这么多问题,甚至没有**一个**支持?你太无耻了。 (2认同)