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

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

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 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.