La oss ta en enkel for loop
#!/bin/bash for i in `seq 1 10`; do echo $i done
AFAIK semikolon i bash-skript gjør at shell utfører gjeldende kommando synkront og deretter går til neste. Å trykke på enter gjør bokstavelig talt det samme, bortsett fra at det ikke tillater deg å angi følgende kommando, og skyll bufferen umiddelbart.
Så hvorfor kan shell ikke tolke følgende linje
for i in `seq 1 10`; do; echo $i; done
hvordan fungerer dette for loop
fungerer?
Svar
Syntaksen til en for
sløyfe fra bash
manuell side er
for name [ [ in [ word ... ] ] ; ] do list ; done
Semikolonene kan erstattes med vognreturer, som nevnt andre steder i bash
manuell side: «En sekvens av en eller flere nye linjer kan vises i en liste i stedet for et semikolon for å avgrense kommandoer.»
Det motsatte er imidlertid ikke sant; du kan ikke vilkårlig erstatte nye linjer med semikolon. Multilinjeskriptet kan konverteres til en enkelt linje så lenge du overholder syntaksreglene ovenfor og ikke setter inn et ekstra semikolon etter do
:
for i in `seq 1 10`; do echo $i; done
Kommentarer
- Det endelige skriptet er feil, som @ dr01 påpekte, du må fjerne semikolonet etter
do
. - @jake, dette sier også at du må fjerne semikolonet etter
do
. I tillegg forklarer dette svaret hvorfor du må fjerne semikolonet etter `gjør '. - Hva om
$i
må være en del av et filnavn? Trenger det doble anførselstegn? - gjør
filename_${i}
da - @ user4556274 i henhold til syntaksen " for jeg gjør; gjort " skal også fungere. hvorfor ' t det?
Svar
Semikolonet etter do
er en feil og burde ikke være der.
Følgende fungerer riktig:
for i in `seq 1 10`; do echo $i; done