Ich möchte nicht unbedingt die Antwort, aber wenn mich jemand auf Literatur oder Beispiele hinweisen könnte. Ich würde es gerne herausfinden.
Wenn ich das Skript ausführe, erhalte ich eine Fehlermeldung:
Syntaxfehler in der Nähe eines unerwarteten Tokens
fi
Ich habe festgestellt, dass mein Problem in meiner if
Aussage liegt, indem ich meine if
Aussagen kommentierte und hinzufügte, in echo "$NAME"
der die Namen angezeigt werden /etc/
.
Wenn ich Änderungen vornehme, die #
aus if
und entferne fi
und zu hinzufüge #
, wc -c "$NAME"
wird der oben aufgeführte Syntaxfehler angezeigt. Ich habe ;
zwischenzeitlich hinzugefügt ]
. Ich bin auch then
ohne Auflösung in die nächste Zeile gewechselt.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
-af
soll das denn machen-a
ist überflüssig, da die Bedingung bereits enthalten ist-f
. --- Auf jeden Fall müssen mehrere Bedingungen innerhalb[ ]
(dieser Befehl ist auch verfügbar alstest
) mit logischen Operatoren wie-a
(und) oder-o
(oder) verknüpft werden. Wie in der Antwort unten vorgeschlagen, ist es jedoch besser, mehrere[ ]
(test
) Befehle und Verknüpfungen zu verwenden sie mit Shell-Operatoren wie&&
oder||
.Antworten:
Schlüsselwörter wie
if
,then
,else
,fi
,for
,case
und so weiter Bedarf an einem Ort zu sein , wo die Schale einen Befehlsnamen erwartet. Ansonsten werden sie wie gewöhnliche Wörter behandelt. Beispielsweise,Es wird nur gedruckt
if
, es wird keine bedingte Anweisung gestartet.Also in der Leitung
Das Wort
then
ist ein Argument des Befehls[
(über das es sich beschweren würde, wenn es jemals ausgeführt würde). Die Shell sucht weiter nachthen
und findet einefi
In-Command-Position. Da es einen gibtif
, der noch auf der Suche istthen
, derfi
unerwartet ist, liegt ein Syntaxfehler vor.Sie müssen einen Befehlsabschluss setzen,
then
damit er als Schlüsselwort erkannt wird. Das gebräuchlichste Befehlsende ist ein Zeilenumbruch. Früher wird jedochthen
häufig ein Semikolon verwendet (das genau die gleiche Bedeutung hat wie ein Zeilenumbruch).oder
Sobald Sie dieses Problem behoben haben, wird der Befehl einen weiteren Fehler enthalten,
[
da er nicht verstanden wird-af
. Sie meinten vermutlichObwohl die Testbefehle wie Optionen aussehen, können Sie sie nicht so bündeln. Sie sind Operatoren des
[
Befehls und müssen jeweils ein separates Wort sein (as do[
und]
).Übrigens, obwohl es
[ -r "$NAME" -a -f "$NAME" ]
funktioniert, empfehle ich das Schreibenoder
Es ist am besten, die
[ … ]
Bedingungen einfach zu halten , da der[
Befehl Operatoren nicht leicht vom Operanden unterscheiden kann. Wenn es$NAME
wie ein Operator aussieht und an einer Position angezeigt wird, an der der Operator gültig ist, kann es als Operator analysiert werden. Dies ist in den einfachen Fällen, die in dieser Antwort angegeben sind, nicht der Fall, aber komplexere Fälle können ein Risiko darstellen. Wenn Sie dies mit separaten Aufrufen an[
die logischen Operatoren der Shell schreiben und diese verwenden, wird dieses Problem vermieden.Die zweite Syntax verwendet das
[[ … ]]
in bash (und ksh und zsh, aber nicht plain sh) vorhandene bedingte Konstrukt. Dieses Konstrukt wird eine spezielle Syntax, während[
wie jeder andere Befehl analysiert wird, so dass Sie Dinge wie können&&
innen und Sie nicht zu zitieren Variablen außer in Argumente für einige String - Operatoren (müssen=
,==
,!=
,=~
) (siehe Wenn doppelt unter Angabe erforderlich ? für Details).quelle
if [[ 1 ]] then [[ 2 ]] fi
in ksh, pdksh und zsh funktioniert.if(:)then(:)fi
funktioniert in allen Schalen.Sehen Sie, was sich wie folgt geändert hat
Wenn Sie alle Befehle im if-Block entfernen möchten, müssen Sie mindestens einen Doppelpunkt hinzufügen, z
oder einzeilige Version
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
quelle
Andere haben bereits darauf hingewiesen, aber wenn Sie nach einer offiziellen Referenz suchen, dann ist RTM
Sie vermissen die
;
Und die Syntax für
list
ist in beschriebenman test
quelle