O que o operador vírgula faz na aritmética do Bash?

4

No manual do Bash, seção 6.5 Aritmética do shell

expr1 , expr2
comma

O que o operador vírgula faz?

As expressões aritméticas são expr1 e expr2 ?

    
por Tim 19.03.2016 / 06:37

2 respostas

8

, é um operador de lista.

A lista de expressões aritméticas será avaliada da esquerda para a direita, o último resultado da expressão é o valor de retorno:

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

O operador , list foi adicionado no bash-2.04-devel (juntamente com os operadores pré / pós incremento / decremento).

Você pode querer ler expr.c para ver como outros operadores foram implementados e funcionam expcomma() para o operador , .

    
por 19.03.2016 / 07:17
3

Bash

O operador vírgula é válido em bash ( LESS=+/'expr1 , expr2' man bash ):

expr1 , expr2
comma

E nenhuma outra explicação sobre seu uso.
Para isso, temos que ler a "Linguagem C" descrição (onde todos os operadores aritméticos nasceram) .

Exemplo (como no link acima) (o segundo dos quais tem o valor 5):

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

Ou mais simples:

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

Sim, cada elemento separado por uma vírgula pode ser uma expressão :

1313    expression:
            assignment-expression
            expression , assignment-expression

POSIX

POSIX não não inclui um operador de vírgula:
Tabela : Operadores padrão ISO C selecionados e palavras-chave de fluxo de controle

Ou apenas tente:

$  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

Como a IBM confirma em sua página do shell AIX e POSIX (ênfase minha):

All of the integral operators, other than ..., and comma (,), are supported.

Mas, também no AIX, a IBM reivindica suporte para o operador de comma o shell ksh93 em /usr/bin/ksh93

More arithmetic operators are available, including the unary +, ++, --, and the ?: construct (for example, "x ? y : z"), as well as the , (comma) operator.

Conclusão:

dash, ksh   do not have a comma operator.
ksh93          may have a comma operator.
bash, zsh   do     have a comma operator.
    
por 19.03.2016 / 18:54