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