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 += 1
o 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 != 10
in test
se 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=2
serí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)}')
.