A substituição de comandos na substituição aritmética obtém divisão de palavras?

1

Parece que lembro dos comentários neste site que o conteúdo da expansão aritmética pode ser dividido, mas não consigo encontrar o comentário novamente.

Considere o seguinte código:

printf '%d\n' "$(($(sed -n '/my regex/{=;q;}' myfile)-1))"

Se o comando sed gerar um número com vários dígitos e $IFS contiver dígitos, a substituição do comando fará com que a palavra seja dividida antes que a aritmética ocorra?

(Eu já testei usando aspas duplas extras:

printf '%d\n' "$(("$(sed -n '/my regex/{=;q;}' myfile)"-1))"

e isso não funciona.

Aliás, o código de exemplo acima é uma alteração de forma reduzida a simplificada de esta função que eu acabei de postar Estouro de pilha.

    
por Wildcard 09.03.2016 / 04:52

2 respostas

3

Não, isso não acontece.

Em $((expression)) , expressão é tratada como se estivesse nas aspas duplas, como POSIX especificado .

Mas cuidado que a expressão dentro de substituição de comando ainda estará sujeita a split+glob :

$ printf '%d\n' "$(( $(IFS=0; a=10; echo $a) + 1 ))"
2

Com aspas duplas:

$ printf '%d\n' "$(( $(IFS=0; a=10; echo "$a") + 1 ))"
11

Como outras expansões, a expansão aritmética, se não estiver entre aspas duplas, sofre split+glob :

$ IFS=0
$ echo $((10))
1
    
por 09.03.2016 / 05:09
1

Do manual do bash (executar LESS=+/'^ *Arithmetic Expansion' man bash ):

Arithmetic Expansion

All tokens in the expression undergo parameter expansion, string expansion, command substitution, and quote removal.

Portanto, nenhuma divisão não é realizada.

    
por 11.03.2016 / 02:38