porque incremento bash: 'n = 0; ((n ++));' erro de retorno? [duplicado]

6
n=0;
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"

de n=1 on, ((n++)) funciona corretamente,
somente quando n=0 , ((n++)) retorna erro,
e estou usando um trap '' ERR que está causando problemas com isso

é algum bug?

    
por Aquarius Power 26.07.2014 / 23:23

3 respostas

9

É porque o valor de retorno de (( expression )) não é usado para indicação de erro. Na% man_de% manpage:

((expression))

The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".

Portanto, no seu caso, como o valor da expressão é zero, o status de retorno de bash é 1.

    
por 26.07.2014 / 23:54
7

A razão é como o pmos escreve acima.

Uma solução seria usar ((++n)) para incrementar. Sua expressão nunca será avaliada como zero e, portanto, nunca parecerá causar um erro.

    
por 26.07.2014 / 23:57
3

Você deve fazer:

echo "$((n+=1))"

Não vai levantar nenhuma armadilha - seu único retorno vem de echo .

Ou, se você desejar usá-lo como autônomo, nos casos em que $n permanecer com menos de 20 dígitos, os dois formulários a seguir sempre retornarão verdadeiro:

n=$((n+1))

Ou:

: "$((n+=1))"
    
por 27.07.2014 / 00:33