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 += 1
ou 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 init
estamos atribuindo um valor constante, não precisamos avaliar uma expressão aritmética. O i != 10
in test
pode 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=2
seria 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)}')
.