Je sais comment créer une for
boucle arithmétique bash
.
Comment faire une boucle équivalente dans un script shell POSIX?
Comme il existe différentes façons d'atteindre le même objectif, n'hésitez pas à ajouter votre propre réponse et à expliquer un peu comment cela fonctionne.
Voici un exemple d'une telle bash
boucle:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
la source
la source
Réponses:
J'ai trouvé des informations utiles dans le wiki Shellcheck.net , je cite:
Frapper:
POSIX:
mais méfiez-vous qui
i++
n'est pas POSIX devrait donc être traduit, par exemple eni += 1
oui = i + 1
.Ainsi, le script ci-dessus dans la question peut être réécrit au niveau POSIX en utilisant ces règles comme ceci:
Bien qu'ici, vous pouvez le rendre plus lisible avec:
comme dans
init
, nous attribuons une valeur constante, nous n'avons donc pas besoin d'évaluer une expression arithmétique. Lei != 10
intest
peut facilement être traduit en une[
expression, et pournext
, en utilisant une affectation de variable shell par opposition à une affectation de variable à l'intérieur d'une expression arithmétique, nous permet de nous débarrasser de:
la nécessité de citer.À côté de
i++
->i = i + 1
, il existe d'autres traductions de constructions spécifiques à ksh / bash qui ne sont pas POSIX que vous pourriez avoir à faire:i=1, j=2
. L',
opérateur arithmétique n'est pas vraiment POSIX (et entre en conflit avec le séparateur décimal dans certains paramètres régionaux avec ksh93). Vous pouvez le remplacer par un autre opérateur comme+
dans,: "$(((i=1) + (j=2)))"
mais son utilisationi=1 j=2
serait beaucoup plus lisible.a[0]=1
: pas de tableaux dans les shells POSIXi = 2**20
: aucun opérateur de puissance dans la syntaxe shell POSIX.<<
est pris en charge, donc pour des puissances de deux, on peut utiliseri = 1 << 20
. Pour les autres pouvoirs, on peut recourir àbc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: pas POSIX. Le plus proche dans le toolchest POSIX esti=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.la source
merci pour votre connaissance approfondie de la différence. Une baisse de remplacement qui fonctionne pour moi lors de l'utilisation de shellcheck.net était comme ci-dessous.
FRAPPER
POSIX
certaines personnes ont noté que seq est également une option en utilisant seq 1 10. Créer une boucle, mais cela dépend du fait que os a seq.
la source