Hvordan laver man en for loop i kommandolinjen?

Lad os tage en enkel for loop

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

AFAIK semikolon i bash-scripts får shell til at udføre den aktuelle kommando synkront og derefter gå til den næste. Ved at trykke på enter er bogstaveligt talt det samme, bortset fra at det ikke tillader dig at indtaste følgende kommando og skylle bufferen med det samme. p>

Så hvorfor kan shell ikke fortolke følgende linje

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

hvordan fungerer denne for loop arbejde?

Svar

Syntaksen for en for -sløjfe fra bash manuel side er

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

Semikolonerne kan erstattes med vognreturer som angivet andetsteds i bash manuel side: “En sekvens af en eller flere nye linjer vises muligvis på en liste i stedet for et semikolon for at afgrænse kommandoer.”

Det omvendte er dog ikke sandt; du kan ikke vilkårligt erstatte nye linjer med semikolon. Dit multiline script kan konverteres til en enkelt linje, så længe du overholder ovenstående syntaksregler og ikke indsætter et ekstra semikolon efter do:

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

Kommentarer

  • Det endelige script er forkert, som @ dr01 påpegede, skal du fjerne semikolon efter do.
  • @jake, dette siger også, at du skal fjerne semikolonet efter do. Derudover forklarer dette svar hvorfor du skal fjerne semikolon efter `gør '.
  • Hvad hvis $i skal være en del af et filnavn? Har det brug for dobbelt anførselstegn?
  • gør filename_${i} derefter
  • @ user4556274 i henhold til syntaksen " for jeg gør; gjort " skal også fungere. hvorfor ' t det?

Svar

Semikolon efter do er en fejl og burde ikke være der.

Følgende fungerer korrekt:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *