Essa é uma extensão de bash (e também zsh , ksh e suas derivadas) para permitir que a variável shell contenha constantes inteiras inválidas para serem reutilizadas na expressão aritmética.
De bash Aritmética da casca :
Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated. Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax. A shell variable that is null or unset evaluates to 0 when referenced by name without using the parameter expansion syntax. The value of a variable is evaluated as an arithmetic expression when it is referenced, or when a variable which has been given the integer attribute using ‘declare -i’ is assigned a value. A null value evaluates to 0. A shell variable need not have its integer attribute turned on to be used in an expression.
Portanto, no seu caso, $((x)) primeiro expandiu x para foo , que é um inteiro inválido, portanto, foo é reutilizado como uma referência de nome de variável. Em seguida, foo foi expandido para bar , o processo acima foi repetido até você obter 6 , que é um inteiro válido.
A especificação POSIX apenas afirmou que $((x)) e $(($x)) retornarão o mesmo valor somente quando x for uma constante inteira válida. Ele não diz nada sobre o caso x é um inteiro inválido, portanto, as implementações do shell estão livres para lidar com essa situação.
O resultado pode ser variado com diferentes camadas.
zsh , ksh e seus derivados se comportam como bash acima (e também busybox sh ).
ash , dash aumentar erro se x contiver inteiro inválido
$ x=foo foo=bar bar=6 dash -c 'echo "$((x))"'
dash: 1: Illegal number: foo
yash deixa a variável como está:
$ x=foo foo=bar bar=6 yash -c 'echo "$((x))"'
foo