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=2
nã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
.