Encontrei informações úteis no wiki Shellcheck.net , cito:
Bater:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))"
while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
embora tenha cuidado com o que i++não é POSIX, teria de ser traduzido, por exemplo, para i += 1ou i = i + 1.
Portanto, o script acima na pergunta pode ser reescrito no POSIX usando regras como esta:
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
Embora 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 initestamos atribuindo um valor constante, não precisamos avaliar uma expressão aritmética. O i != 10in testpode ser facilmente traduzido para uma [expressão e next, usando uma atribuição de variável do shell em oposição a uma atribuição de variável dentro de uma expressão aritmética, nos livramos da :necessidade de citar.
Ao lado de i++-> i = i + 1, há mais traduções de construções específicas do ksh / bash que não são POSIX que você pode precisar fazer:
i=1, j=2. O ,operador aritmético 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 +no exemplo, : "$(((i=1) + (j=2)))"mas o uso i=1 j=2seria muito mais legível.
a[0]=1: sem matrizes em shells POSIX
i = 2**20: nenhum operador de energia na sintaxe do shell POSIX. <<é suportado, porém, para potências de dois, pode-se usar i = 1 << 20. Para outros poderes, pode-se recorrer a bc:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3: não POSIX. O mais próximo no baú da ferramenta POSIX é i=$(awk 'BEGIN{srand(); print int(rand() * 3)}').