Ich weiß, wie man eine arithmetische for
Schleife erstellt bash
.
Wie kann man eine äquivalente Schleife in einem POSIX-Shell-Skript ausführen?
Da es verschiedene Möglichkeiten gibt, dasselbe Ziel zu erreichen, können Sie Ihre eigene Antwort hinzufügen und ein wenig erläutern, wie es funktioniert.
Ein Beispiel für eine solche bash
Schleife folgt:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
quelle
quelle
Antworten:
Ich habe nützliche Informationen im Shellcheck.net-Wiki gefunden , ich zitiere:
Bash:
POSIX:
Beachten Sie jedoch, dass
i++
es sich nicht um POSIX handelt, sondern dass es übersetzt werden müsste, beispielsweise nachi += 1
oderi = i + 1
.Das obige Skript in der Frage kann also POSIX-weise unter Verwendung der folgenden Regeln neu geschrieben werden:
Hier können Sie es jedoch besser lesbar machen mit:
Wie in
init
weisen wir einen konstanten Wert zu, sodass wir keinen arithmetischen Ausdruck auswerten müssen. Dasi != 10
intest
kann leicht in einen[
Ausdruck übersetzt werden, undnext
wenn wir eine Shell-Variablenzuweisung im Gegensatz zu einer Variablenzuweisung innerhalb eines arithmetischen Ausdrucks verwenden, können wir:
die Notwendigkeit des Zitierens beseitigen.Neben
i++
->i = i + 1
gibt es weitere Übersetzungen von ksh / bash-spezifischen Konstrukten, die nicht POSIX sind, die Sie möglicherweise ausführen müssen:i=1, j=2
. Der,
arithmetische Operator ist nicht wirklich POSIX (und widerspricht dem Dezimaltrennzeichen in einigen Gebietsschemas mit ksh93). Sie könnten es durch einen anderen Operator wie+
in ersetzen,: "$(((i=1) + (j=2)))"
aber die Verwendungi=1 j=2
wäre viel besser lesbar.a[0]=1
: Keine Arrays in POSIX-Shellsi = 2**20
: Kein Energieoperator in der POSIX-Shell-Syntax.<<
wird jedoch unterstützt, so dass man für Zweierpotenzen verwenden kanni = 1 << 20
. Für andere Mächte kann man auf Folgendes zurückgreifenbc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: nicht POSIX. Der nächstgelegene in der POSIX-Toolchest isti=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.quelle
Vielen Dank für das oben genannte Hintergrundwissen über den Unterschied. Ein Rückgang des Ersatzes, der bei Verwendung von shellcheck.net für mich funktioniert, war wie folgt.
BASH
POSIX
Einige Leute bemerkten, dass seq auch eine Option ist, die seq 1 10 verwendet. Das Erstellen einer Schleife hängt jedoch davon ab, dass os seq hat.
quelle