Wie erstelle ich eine for-Schleife in der Befehlszeile?

22

Nehmen wir ein einfaches for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

AFAIK-Semikolon in Bash-Skripten bewirkt, dass die Shell den aktuellen Befehl synchron ausführt und dann zum nächsten übergeht. Wenn Sie die Eingabetaste drücken, ist dies im wahrsten Sinne des Wortes identisch, es ist jedoch nicht möglich, den folgenden Befehl einzugeben und den Puffer sofort zu leeren.

Warum kann Shell die folgende Zeile nicht interpretieren?

for i in `seq 1 10`; do; echo $i; done

wie funktioniert das for loopeigentlich

user30167
quelle

Antworten:

16

Die Syntax einer forSchleife aus der bashManualpage lautet

for name [ [ in [ word ... ] ] ; ] do list ; done

Die Semikolons können durch bashZeilenumbrüche ersetzt werden, wie an anderer Stelle auf der Handbuchseite angegeben: "Eine Folge von einer oder mehreren Zeilenumbrüchen wird möglicherweise in einer Liste anstelle eines Semikolons angezeigt, um Befehle abzugrenzen."

Das Gegenteil ist jedoch nicht der Fall. Sie können Zeilenumbrüche nicht beliebig durch Semikolons ersetzen. Ihr mehrzeiliges Skript kann in eine einzelne Zeile konvertiert werden, solange Sie die obigen Syntaxregeln einhalten und kein zusätzliches Semikolon nach den dofolgenden Zeichen einfügen :

for i in `seq 1 10`; do echo $i; done
user4556274
quelle
2
Das letzte Skript ist falsch, wie @ dr01 gezeigt hat, müssen Sie das Semikolon danach entfernen do.
Jake
1
@jake, dies bedeutet auch, dass Sie das Semikolon danach entfernen müssen do. Außerdem erklärt diese Antwort, warum Sie das Semikolon nach "do" entfernen müssen.
user4556274
Was ist, wenn $iein Teil eines Dateinamens sein muss? Benötigt es doppelte Anführungszeichen?
Anonym
18

Das Semikolon nach doist ein Fehler und sollte nicht vorhanden sein.

Folgendes funktioniert ordnungsgemäß:

for i in `seq 1 10`; do echo $i; done 
dr01
quelle