Sé cómo crear un for
ciclo aritmético bash
.
¿Cómo se puede hacer un bucle equivalente en un script de shell POSIX?
Como hay varias formas de lograr el mismo objetivo, siéntase libre de agregar su propia respuesta y elaborar un poco sobre cómo funciona.
A continuación se muestra un ejemplo de uno de estos bash
bucles:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
fuente
fuente
Respuestas:
He encontrado información útil en el wiki de Shellcheck.net , cito:
Golpetazo:
POSIX:
aunque tenga en cuenta que
i++
no es POSIX, por lo que tendría que traducirse, por ejemplo, ai += 1
oi = i + 1
.Por lo tanto, la secuencia de comandos anterior en la pregunta se puede reescribir en POSIX utilizando reglas como esta:
Aunque aquí, puedes hacerlo más legible con:
como en
init
, estamos asignando un valor constante, por lo que no necesitamos evaluar una expresión aritmética. Eli != 10
intest
se puede traducir fácilmente a una[
expresión ynext
, 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 usarloi=1 j=2
sería mucho más legible.a[0]=1
: sin matrices en shells POSIXi = 2**20
: sin operador de potencia en la sintaxis de shell POSIX.<<
aunque es compatible con potencias de dos, uno puede usari = 1 << 20
. Para otros poderes, uno puede recurrir abc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: no POSIX. El más cercano en el POSIX toolchest esi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.fuente
Gracias por el conocimiento de fondo sobre la diferencia. Una caída en el reemplazo que funcionó para mí cuando uso shellcheck.net fue la siguiente.
GOLPETAZO
POSIX
algunas personas notaron que seq también es una opción usando seq 1 10. Crear un bucle, sin embargo, esto depende de que os tenga seq.
fuente