Encontrei informações úteis no wiki do Shellcheck.net , e cito:
-
Bash:
for ((init; test; next)); do foo; done -
POSIX:
: "$((init))" while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
embora tenha cuidado, pois i++ não é POSIX então teria que ser traduzido, por exemplo para i += 1 ou i = i + 1 .
Assim, o script acima na pergunta pode ser reescrito no POSIX usando as regras como esta:
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
Embora esteja aqui, você pode torná-lo mais legível com:
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
como em init , estamos atribuindo um valor constante, portanto, não precisamos avaliar uma expressão aritmética. O i != 10 in test pode ser facilmente traduzido para uma expressão [ , e para next , usando uma atribuição de variável shell ao contrário de uma atribuição variável dentro de uma expressão aritmética, nos permite eliminar : e a necessidade de citar.
Ao lado de i++ - > i = i + 1 , existem mais traduções de construções específicas do ksh / bash que não são POSIX que você possa ter que fazer:
-
%código%. O operador de aritmética
i=1, j=2não é realmente POSIX (e entra em conflito com o separador decimal em algumas localidades com ksh93). Você poderia substituí-lo por outro operador como,como em+, mas usar: "$(((i=1) + (j=2)))"seria muito mais legível. -
i=1 j=2: sem matrizes em shells POSIX -
a[0]=1: no power operator na sintaxe do shell POSIX.i = 2**20é suportado, portanto, para potências de dois, pode-se usar<<. Para outros poderes, pode-se recorrer ai = 1 << 20:bc -
i=$(echo "3 ^ 20" | bc): não POSIX. O mais próximo do toolkit de POSIX éi = RANDOM % 3.