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