Ich habe folgendes zum Arbeiten gebracht:
for i in {2..10}
do
echo "output: $i"
done
Es produziert eine Reihe von Linien output: 2
, output: 3
, so weiter.
Versuchen Sie jedoch Folgendes auszuführen:
max=10
for i in {2..$max}
do
echo "$i"
done
erzeugt folgendes:
output: {2..10}
Wie kann ich den Compiler dazu bringen, zu erkennen, dass er $ max als das andere Ende des Arrays und nicht als Teil eines Strings behandeln soll?
echo "$i
sollte seinecho "$i"
- wird das Problem jedoch nicht beheben.do
undthen
in derselben Zeile wiefor
undif
angezeigt. ZBfor i in {2..10}; do
Antworten:
Die Klammererweiterung {x..y} wird vor anderen Erweiterungen ausgeführt, sodass Sie diese nicht für Sequenzen variabler Länge verwenden können.
Verwenden Sie stattdessen die
seq 2 $max
Methode als Benutzer mob angegeben .Für Ihr Beispiel wäre es also:
quelle
seq
Zahlen in der for-Schleife zu zählen und zu erhöhen. Daher wird empfohlen, die Verwendung zu vermeidenseq
. Dieser Befehl wird aus Gründen der Kompatibilität mit der alten Bash beibehalten. Die eingebauten Befehle sind schnell genug.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
Syntax ist nicht POSIX und das bedeutet zum Beispiel, dass sie bei Dingen wie Alpine Linux nicht sofort funktioniert.seq
tut.#!/bin/sh
ist Dash in Debian / Ubuntu.Probieren Sie die arithmetische Ausdrucksversion von
for
:Dies ist in den meisten Versionen von Bash verfügbar und sollte auch mit Bourne Shell (sh) kompatibel sein.
quelle
sh
, sondern stellen eine Verbindung zu einer anderen Shell her. Im Idealfall wird eine solche Shell aufgerufen,sh
die nur diese Funktionen im POSIX-Standard unterstützt, aber standardmäßig einige ihrer zusätzlichen Funktionen durchlässt. Die for-Schleife im C-Stil ist keine POSIX-Funktion, kann jedochsh
von der eigentlichen Shell im Modus sein.Schritt die Schleife manuell:
Wenn Sie nicht vollständig POSIX sein müssen, können Sie die arithmetische for- Schleife verwenden:
Oder verwenden Sie jot (1) auf BSD-Systemen:
quelle
true $(( i++ ))
funktioniert nicht in allen Fällen, daher wären die meisten tragbartrue $((i=i+1))
.Es gibt mehr als einen Weg, dies zu tun.
quelle
eval
bewertet wird, was Sie eingestellt habenmax
. Überlegen Siemax="2}; echo ha; #"
, und ersetzen Sie esecho ha
durch etwas Destruktiveres.Wenn der
seq
Befehl auf Ihrem System verfügbar ist:Wenn nicht, dann benutze arme Männer
seq
mitperl
:Beobachten Sie diese Anführungszeichen.
quelle
Dies ist ein Weg:
Bash:
Der obige Bash-Weg funktioniert auch für
ksh
undzsh
, wenn erbash -c
durchksh -c
oderzsh -c
ersetzt wird.Hinweis:
for i in {2..${max}}; do echo $i; done
funktioniert inzsh
undksh
.quelle
Wir können Schleifen wie bei der C-Programmierung iterieren.
quelle
Hier funktionierte es unter Mac OS X.
Es enthält das Beispiel eines BSD-Datums, wie das Datum erhöht und verringert wird.
quelle
Da ich den
seq
Befehl nicht auf meinem System installiert hatte (Mac OS X 10.6.1 (Snow Leopard)), habe ich stattdessen einewhile
Schleife verwendet:* Achselzucken * Was auch immer funktioniert.
quelle
Diese alle tun
{1..8}
und sollten alle POSIX sein. Sie werden auch nicht unterbrochen, wenn Sie eine Bedingungcontinue
in die Schleife einfügen. Der kanonische Weg:Ein anderer Weg:
und ein anderer:
quelle
Verwenden:
Sie benötigen den expliziten Aufruf 'eval', um das {} nach dem Ersetzen der Variablen neu zu bewerten.
quelle