Syntaxfehler an einem Semikolon in einem Shell-Skript

7

Der One-Liner-Befehl ist länger, aber dies ist der Teil, der den Fehler auslöst.

for user in natural1 ; do 
cat <<EOT >> /home/$user/public_html/.htaccess
<FilesMatch "wp-login.php">
AuthType Basic
AuthName "Secure Area"
AuthUserFile "/home/$user/.htaccesspasswd"
require valid-user
</FilesMatch>
EOT
; done

-bash: syntax error near unexpected token `;'
JCats
quelle
4
entfernen ;in ; done. Bash ist nicht C. Bash ist launisch, wenn Sie unnötig hinzufügen; wo du schon newline hast
frostschutz
Ganz einfach, ich hatte den Eindruck, dass immer beim Schließen der for-Anweisung erforderlich ist, vielen Dank!
JCats
1
Eigentlich behandelt Bash ;als Zeilenumbruch. Sie können also entweder ein Semikolon zwischen natural1 und do verwenden oder do in die nächste Zeile setzen. Beides wäre eine gültige Syntax. Viele Programmierer verwenden das Semikolon, weil sie es besser finden, die Schleifendeklaration in einer einzelnen Zeile zu enthalten. Aus diesem Grund macht es nie Sinn, eine Zeile mit ;in bash zu beginnen, an die ich denken kann.
Centimane

Antworten:

12

Ein Semikolon oder ein kaufmännisches Und ( ;oder &) in einem Shell-Skript ist ein Befehlsterminator. Sie können es nicht verwenden, wenn es keinem Befehl folgt. ;bedeutet "den vorhergehenden Befehl im Vordergrund &ausführen " und "den vorhergehenden Befehl im Hintergrund ausführen".

Eine neue Zeile in einem Shell-Skript ist ein "schwacher" Befehlsterminator. Wenn ein Befehl zum Beenden vorhanden ist, entspricht dies einem Semikolon. Wenn kein Befehl zum Beenden vorhanden ist, hat der Zeilenumbruch keine Auswirkung.

Die neue Zeile nach cat <<EOT >> /home/$user/public_html/.htaccessbeendet den cat …Befehl. Das Semikolon nach dem Here-Dokument hat also nichts zu beenden. (Ein Here-Dokument ist kein Befehl. Das Here-Dokument wird an den Befehl in der vorhergehenden Zeile angehängt, dh an den cat …Befehl.) Wenn Sie den cat …Befehl explizit mit einem Semikolon beenden möchten, müssen Sie ihn an der Stelle setzen Ende der cat …Zeile.

Gilles 'SO - hör auf böse zu sein'
quelle
Ihre Antwort war 2015 richtig, aber heute nicht mehr 100% richtig. Eine Befehlszeile, die mit einem Semikolon beginnt, ist kein Fehler mehr.
schily
1
@schily Auf der Maschine, die ich gerade benutze, beschweren sich Dash, Bash, Lksh, Mksh, Posh und Busybox über eine führende Position ;. Nur ksh93 und zsh sind damit zufrieden. Meine Antwort bezieht sich auf Systeme, auf die Menschen wahrscheinlich stoßen, nicht auf das, was der neueste POSIX-Entwurf sagt.
Gilles 'SO - hör auf böse zu sein'
ksh93tut es seit längerer Zeit und ich habe es vor bosheinem Jahr implementiert , nachdem wir uns letztes Jahr entschieden hatten, die POSIX-Syntax zu ändern. Ich wollte erklären, dass es eine Tendenz gibt, dies zuzulassen, obwohl diese Änderung z { ;.
schily