Hvordan lage en for loop på kommandolinjen?

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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *