Wie erstelle ich eine for-Schleife in der Kommandozeile?

Nehmen wir eine einfache 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. Durch Drücken der Eingabetaste wird derselbe Befehl buchstäblich genauso ausgeführt, außer dass Sie den folgenden Befehl nicht eingeben und den Puffer sofort leeren können.

Warum kann die Shell die folgende Zeile nicht interpretieren?

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

Wie funktioniert diese for loop tatsächlich? Arbeit?

Antwort

Die Syntax einer for -Schleife aus der bash Handbuchseite ist

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

Die Semikolons können durch Zeilenumbrüche ersetzt werden, wie an anderer Stelle in der bash Handbuchseite: „In einer Liste wird möglicherweise eine Folge von einer oder mehreren Zeilenumbrüchen anstelle eines Semikolons angezeigt, um Befehle abzugrenzen.“

Das Gegenteil ist jedoch nicht der Fall Ersetzen Sie Zeilenumbrüche willkürlich mit Semikolons. Ihr mehrzeiliges Skript kann in eine einzelne Zeile konvertiert werden, solange Sie die obigen Syntaxregeln beachten und kein zusätzliches Semikolon nach do einfügen:

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

Kommentare

  • Das endgültige Skript ist falsch. Wie @ dr01 hervorhob, müssen Sie das Semikolon nach .
  • @jake, dies bedeutet auch, dass Sie das Semikolon nach do entfernen müssen. Darüber hinaus erklärt diese Antwort warum Sie das Semikolon nach `do ' entfernen müssen.
  • Was ist, wenn $i muss Teil eines Dateinamens sein? Benötigt es doppelte Anführungszeichen?
  • do filename_${i} dann
  • @ user4556274 gemäß der Syntax " denn ich tue; erledigt " sollte ebenfalls funktionieren. Warum ist ' nicht so?

Antwort

Das Semikolon nach do ist ein Fehler und sollte nicht vorhanden sein.

Folgendes funktioniert ordnungsgemäß:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.