Verwirrend Syntaxfehler in der Nähe unerwartetes token 'done'
Ich versuche zu lernen, shell-scripting, so dass ich erstellt ein einfaches script mit einer Schleife, die nichts tut:
#!/bin/bash
names=(test test2 test3 test4)
for name in ${names[@]}
do
#do something
done
allerdings, wenn ich dieses Skript ausführen bekomme ich folgenden Fehler:
./test.sh: Zeile 6: Syntaxfehler in der Nähe unerwartetes token fertig"
./test.sh: Zeile 6: fertig'
Was habe ich hier verpasst? sind shell-Skripte Registerkarte 'empfindlich'?
Nur einmal zu sehen stackoverflow.com/a/42478844/6545759 Es kann hilfreich sein,
InformationsquelleAutor fenerlitk | 2012-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, shell-Skripte sind nicht die Registerkarte empfindlich (es sei denn, Sie tun etwas wirklich verrückt, was Sie nicht tun, werden in diesem Beispiel).
Können Sie nicht haben eine leere
while do done
block (Kommentare zählen nicht)Tauschen
echo $name
stattAusgabe
Ich bin froh, dass es geholfen hat. Siehe mein edit. Viel Glück.
beachten Sie, dass
echo
ist sehr praktisch, um print line-by-line-Daten wie in der original-Beispiel zeigte. Erfahren Sie mehr überprintf
(die Suche hier auf der S. O. Beispiele), wie es wirklich leistungsfähige und flexible Hilfe bei der Formatierung der Druck Ihrer Daten. Viel Glück.Eine gültige "no-op" - Befehl ist eine
:
ja, guter Punkt. Als fenerlitk sagte "ich versuche zu lernen, shell scripting", dachte ich, es machte Sinn, dass er/Sie wollen würde, um zu sehen, die Schleife in Aktion. Fenerlitk , beachten Sie, dass die ':' no-op Befehl hätte in deiner Schleife, bevor Sie kommentieren, D. H.
: # do something
, und die Schleife würde beendet, aber Sie würden nicht gesehen haben, was passiert. Viel Glück an alle.InformationsquelleAutor shellter
dash
undbash
sind ein bisschen Gehirn-Toten in diesem Fall, erlauben Sie nicht eine leere Schleife, so dass Sie brauchen, um hinzuzufügen, ein no-op Befehl zu machen, diese auszuführen, z.B.true
oder:
. Meine tests zeigen die:
ist ein bisschen schneller, obwohl Sie die gleiche sein sollte, nicht sicher, warum:n Durchschnitt dauert
0.262
Sekunden, während:nimmt
0.293
Sekunden. Interessant:nimmt
0.356
Sekunden.Alle Messungen sind durchschnittlich 30 läuft.
Nicht die Verarbeitung ist in Ordnung, dabei ein syntax-Fehler ist nicht
InformationsquelleAutor Thor
Bash hat eine eingebaute no-op, der Doppelpunkt (:), die ist leichter
als Laich einem anderen Prozess ausgeführt
true
.EDIT: William richtig darauf hin, dass
true
ist auch ein shell-built-in, so nehmen Sie diese Antwort einfach als eine weitere option zur info, nicht eine bessere Lösung als die Verwendung von true.Bash
:
ist wie Pythonpass
AnleitungAuch zu beachten (5 Jahre später)
:
ist erforderlich von POSIX zu einem integrierten, währendtrue
ist nur Optional (aber ich Wette, fast immer) eine built-in.InformationsquelleAutor chepner
Könnte man ersetzen, das nichts mit "wahr" statt.
do true; done ... aber warum ist die Schleife leer?
InformationsquelleAutor Ja͢ck
Müssen Sie etwas in Ihrem Schleife sonst bash beschwert.
InformationsquelleAutor Douglas Leeder
Dieser Fehler wird voraussichtlich mit einigen Versionen von bash, wo das script wurde editiert, auf Windows und so das Skript sieht eigentlich wie folgt:
wo die ^M stellt die carriage-return-Zeichen (0x0D). Dies kann leicht gesehen werden, in vi die binäre option wie:
Entfernen die carriage-return-Zeichen verwenden Sie einfach den vi Befehl:
(beachten Sie, dass die ^M über ein einzelnes Wagenrücklauf-Zeichen, um Sie in den editor verwenden sequence Control-V Control-M)
InformationsquelleAutor Dror Harari