Ich habe das folgende Bash-Skript:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
Die erste for
Schleife ( ohne die Variable upperlim
in der Schleifensteuerung) funktioniert einwandfrei, die zweite for
Schleife ( mit der Variablen upperlim
in der Schleifensteuerung) jedoch nicht. Kann ich die zweite for
Schleife so ändern , dass sie funktioniert? Vielen Dank für Ihre Zeit.
bash
shell
shell-script
for
Andrew
quelle
quelle
for i in {0..$((upperlim))}; do echo $i; done
geht auch nichtAntworten:
Der Grund dafür ist die Reihenfolge, in der die Dinge in Bash auftreten. Die Klammererweiterung erfolgt, bevor Variablen erweitert werden. Um Ihr Ziel zu erreichen, müssen Sie C-style for loop verwenden:
quelle
zsh
(aber nicht fürcsh
,tcsh
).Um dies in Ihrem Stil zu vervollständigen, müssen Sie eval verwenden:
Aber mit
seq
:Persönlich finde ich die Verwendung
seq
besser lesbar.quelle
seq
ist ein externer Befehl und nicht überall dort verfügbar, wo bash ist.seq
" und bestätigte, dass es kein eingebautes ist.read
ist ein eingebautes zum Beispiel, aber es gibt keinen Grundeval
dafür.Der POSIX-Weg
Wenn Sie Wert auf Portabilität legen, verwenden Sie das Beispiel aus dem POSIX-Standard :
Ausgabe:
Dinge die nicht POSIX sind:
(( ))
ohne Dollar, obwohl es eine übliche Erweiterung ist, wie von POSIX selbst erwähnt .[[
.[
ist genug hier. Siehe auch: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, und das kann nicht mit Variablen funktionieren, wie im Bash-Handbuch erwähnt .let i=i+1
: POSIX 7 2. Shell Command Language enthält das Wort nichtlet
und schlägt inbash --posix
4.3.42 fehlDer Dollar
i=$i+1
könnte erforderlich sein, aber ich bin nicht sicher. POSIX 7 2.6.4 Arithmetische Erweiterung sagt:aber wenn man es wörtlich liest, bedeutet das nicht, dass
$((x+1))
sich das erweitert, dax+1
es keine Variable ist.quelle
Ihr Ansatz funktioniert nicht, da die Erweiterung in geschweiften Klammern vor der Parametererweiterung erfolgt. Sie müssen die Variable zuvor erweitern.
Sie können mit eval umgehen :
Mit While-Schleife :
Sie können dies auch mit dem Befehl seq tun :
Wenn Sie mit rennen möchten, müssen
for i in {0..$upperlim}
Sie Kornshell verwenden. z.B:quelle