He encontrado información útil en el wiki de Shellcheck.net , cito:
Golpetazo:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))"
while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
aunque tenga en cuenta que i++no es POSIX, por lo que tendría que traducirse, por ejemplo, a i += 1o i = i + 1.
Por lo tanto, la secuencia de comandos anterior en la pregunta se puede reescribir en POSIX utilizando reglas como esta:
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
Aunque aquí, puedes hacerlo más legible con:
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
como en init, estamos asignando un valor constante, por lo que no necesitamos evaluar una expresión aritmética. El i != 10in testse puede traducir fácilmente a una [expresión y next, al usar una asignación variable de shell en lugar de una asignación variable dentro de una expresión aritmética, nos permite deshacernos de :la necesidad de citar.
Además de i++-> i = i + 1, hay más traducciones de construcciones específicas de ksh / bash que no son POSIX que podría tener que hacer:
i=1, j=2. El ,operador aritmético no es realmente POSIX (y entra en conflicto con el separador decimal en algunas configuraciones regionales con ksh93). Podría reemplazarlo con otro operador +como en el caso, : "$(((i=1) + (j=2)))"pero usarlo i=1 j=2sería mucho más legible.
a[0]=1: sin matrices en shells POSIX
i = 2**20: sin operador de potencia en la sintaxis de shell POSIX. <<aunque es compatible con potencias de dos, uno puede usar i = 1 << 20. Para otros poderes, uno puede recurrir a bc:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3: no POSIX. El más cercano en el POSIX toolchest es i=$(awk 'BEGIN{srand(); print int(rand() * 3)}').