Hoe maak je een for-lus in de opdrachtregel?

Laten we “een simpele for loop

#!/bin/bash for i in `seq 1 10`; do echo $i done 

AFAIK-puntkomma in bash-scripts zorgt ervoor dat de shell het huidige commando synchroon uitvoert en dan naar het volgende gaat. Door op enter te drukken wordt letterlijk hetzelfde gedaan, behalve dat je het volgende commando niet kunt invoeren, waardoor de buffer onmiddellijk wordt leeggemaakt.

Dus waarom kan shell “de volgende regel niet interpreteren

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

hoe werkt dit for loop eigenlijk werk?

Antwoord

De syntaxis van een for lus van de bash man-pagina is

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

De puntkommas kunnen worden vervangen door regelterugloop, zoals elders in de bash manual pagina: “Een reeks van een of meer nieuwe regels kan in een lijst verschijnen in plaats van een puntkomma om commandos te begrenzen.”

Het omgekeerde is echter niet waar; je kunt het niet vervang willekeurig nieuwe regels met puntkommas. Uw script met meerdere regels kan worden geconverteerd naar een enkele regel, zolang u de bovenstaande syntaxisregels in acht neemt en geen extra puntkomma invoegt na de do:

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

Reacties

  • Het uiteindelijke script is fout, zoals @ dr01 aangaf, je moet de puntkomma na .
  • @jake, dit zegt ook dat je de puntkomma na do moet verwijderen. Bovendien legt dit antwoord uit waarom u de puntkomma na `do ' moet verwijderen.
  • Wat als $i moet onderdeel zijn van een bestandsnaam? Heeft het dubbele aanhalingstekens nodig?
  • doe filename_${i} en vervolgens
  • @ user4556274 volgens de syntaxis " want ik doe; done " zou ook moeten werken. waarom niet ' t?

Antwoord

De puntkomma after do is een fout en zou er niet moeten zijn.

Het volgende werkt correct:

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *