Laten we “een simpele for loop
#!/bin/bash for i in `seq 1 10`; do echo $i done
AFAIK-puntkomma in bash-scripts zorgt ervoor dat de shell het huidige commando synchroon uitvoert en dan naar het volgende gaat. Door op enter te drukken wordt letterlijk hetzelfde gedaan, behalve dat je het volgende commando niet kunt invoeren, waardoor de buffer onmiddellijk wordt leeggemaakt.
Dus waarom kan shell “de volgende regel niet interpreteren
for i in `seq 1 10`; do; echo $i; done
hoe werkt dit for loop
eigenlijk werk?
Antwoord
De syntaxis van een for
lus van de bash
man-pagina is
for name [ [ in [ word ... ] ] ; ] do list ; done
De puntkommas kunnen worden vervangen door regelterugloop, zoals elders in de bash
manual pagina: “Een reeks van een of meer nieuwe regels kan in een lijst verschijnen in plaats van een puntkomma om commandos te begrenzen.”
Het omgekeerde is echter niet waar; je kunt het niet vervang willekeurig nieuwe regels met puntkommas. Uw script met meerdere regels kan worden geconverteerd naar een enkele regel, zolang u de bovenstaande syntaxisregels in acht neemt en geen extra puntkomma invoegt na de do
:
for i in `seq 1 10`; do echo $i; done
Reacties
- Het uiteindelijke script is fout, zoals @ dr01 aangaf, je moet de puntkomma na .
- @jake, dit zegt ook dat je de puntkomma na
do
moet verwijderen. Bovendien legt dit antwoord uit waarom u de puntkomma na `do ' moet verwijderen. - Wat als
$i
moet onderdeel zijn van een bestandsnaam? Heeft het dubbele aanhalingstekens nodig? - doe
filename_${i}
en vervolgens - @ user4556274 volgens de syntaxis " want ik doe; done " zou ook moeten werken. waarom niet ' t?
Antwoord
De puntkomma after do
is een fout en zou er niet moeten zijn.
Het volgende werkt correct:
for i in `seq 1 10`; do echo $i; done