Hogyan készítsünk egy for ciklust a parancssorban?

Vegyünk egy egyszerű for loop

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

Az AFAIK pontosvessző a bash szkriptekben a shell szinkron módon hajtja végre az aktuális parancsot, majd folytassa a következővel. Az Enter lenyomása szó szerint ugyanezt teszi, kivéve, hogy “nem engedi megadni a következő parancsot, és azonnal kiöblíti a puffert. p>

Miért nem értelmezheti a shell a következő sort?

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

Hogyan is működik ez a for loop működik?

Válasz

A for hurok szintaxisa a bash kézikönyv oldal

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

A pontosvesszőket helyettesíteni lehet kocsivisszákkal, amint azt máshol a bash kézikönyv: “A parancsok lehatárolásához pontosvessző helyett egy vagy több új sor sorozata jelenhet meg a listában.”

Viszont a fordítottja nem igaz; nem lehet önkényesen cserélje ki az új sorokat pontosvesszővel. Többsoros szkriptje konvertálható egyetlen sorra, mindaddig, amíg betartja a fenti szintaxisszabályokat, és nem szúr be extra pontosvesszőt a do után:

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

Megjegyzések

  • Az utolsó szkript hibás, amint arra a @ dr01 rámutatott, el kell távolítania a pontosvesszőt a .
  • @jake, ez azt is mondja, hogy el kell távolítania a pontosvesszőt a do után. Ezenkívül ez a válasz elmagyarázza, hogy miért el kell távolítania a pontosvesszőt a `do ' után.
  • Mi van, ha $i fájlnévnek kell lennie? Szüksége van dupla idézőjelekre?
  • filename_${i} akkor
  • @ user4556274 a szintaxis szerint " mert én csinálom; a kész " -nek is működnie kell. miért nem ' t?

Válasz

A pontosvessző a do után hiba, és nem lehet ott.

A következő megfelelően működik:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük