Dentro de (( ... )) avaliação aritmética, = é um operador de atribuição não é um operador comparação lógica . Portanto, $(($w = 0)) é a variável de desreferência w e, em seguida, tentar atribuir o valor 0 ao seu valor .
Provavelmente, o que você pretendia era if $(($w == 0)) . No entanto, embora sintaticamente correta, a sintaxe de expansão de parâmetro $w não é necessária neste contexto, portanto, você pode simplificar isso para if ((w == 0)) e, da mesma forma, para $(( $w != 0 )) e assim por diante. Na seção ARITHMETIC EVALUATION de man bash :
Shell variables are allowed as operands; parameter expansion is per‐ formed before the expression is evaluated. Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.
Observe também que -le , -gt operadores são para comparação aritmética dentro de [ ... ] ou [[ ... ]] colchetes de teste; dentro de (( ... )) colchetes (que são para avaliação aritmética somente ), você deve usar <= , > e assim por diante.