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 `;'
bash
shell-script
JCats
quelle
quelle
;
in; done
. Bash ist nicht C. Bash ist launisch, wenn Sie unnötig hinzufügen; wo du schon newline hast;
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.Antworten:
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/.htaccess
beendet dencat …
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 dencat …
Befehl.) Wenn Sie dencat …
Befehl explizit mit einem Semikolon beenden möchten, müssen Sie ihn an der Stelle setzen Ende dercat …
Zeile.quelle
;
. 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.ksh93
tut es seit längerer Zeit und ich habe es vorbosh
einem 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{ ;
.