Ist es möglich, eine Bash-Skriptsyntax zu überprüfen, ohne sie auszuführen?
Mit Perl kann ich Perl -c 'script name'
. Gibt es einen entsprechenden Befehl für Bash-Skripte?
bash -n scriptname
Vielleicht eine offensichtliche Einschränkung: Hiermit wird die Syntax überprüft, aber nicht, ob Ihr Bash-Skript versucht, einen Befehl auszuführen, der sich nicht in Ihrem Pfad befindet, z. B. ech hello
anstatt echo hello
.
Zeit verändert alles. Hier ist eine Website die eine Online-Syntaxprüfung für Shell-Skripte bietet.
Ich fand es sehr leistungsfähig, häufige Fehler zu erkennen.
ShellCheck ist ein statisches Analyse- und Flusentool für sh/bash-Skripte. Es konzentriert sich hauptsächlich auf die Behandlung typischer Anfänger- und Mittelstufensyntaxfehler und Fallstricke, bei denen die Shell nur eine kryptische Fehlermeldung oder ein seltsames Verhalten ausgibt, es werden jedoch auch einige fortgeschrittenere Probleme gemeldet, bei denen Eckfälle zu verzögerten Fehlern führen können.
Haskell-Quellcode ist auf GitHub verfügbar!
Ich aktiviere auch die Option 'u' für jedes Bash-Skript, das ich schreibe, um zusätzliche Überprüfungen durchzuführen:
set -u
Hiermit wird die Verwendung nicht initialisierter Variablen gemeldet, wie im folgenden Skript 'check_init.sh'.
#!/bin/sh
set -u
message=hello
echo $mesage
Ausführen des Skripts:
$ check_init.sh
Wird Folgendes berichten:
./check_init.sh[4]: mesage: Parameter nicht gesetzt.
Sehr nützlich, um Tippfehler zu fangen
sh -n script-name
Führen Sie das aus. Wenn das Skript Syntaxfehler enthält, wird dieselbe Fehlermeldung zurückgegeben. Wenn es keine Fehler gibt, wird es ohne Meldung ausgegeben. Sie können dies sofort überprüfen, indem Sie echo $?
Verwenden. Dadurch wird 0
Als Bestätigung ohne Fehler zurückgegeben.
Es hat bei mir gut funktioniert. Ich lief unter Linux, Bash Shell.
Ich überprüfe tatsächlich alle Bash-Skripte im aktuellen Verzeichnis auf Syntaxfehler, OHNE sie mit dem Tool find
auszuführen:
Beispiel:
find . -name '*.sh' -exec bash -n {} \;
Wenn Sie es für eine einzelne Datei verwenden möchten, bearbeiten Sie einfach den Platzhalter mit dem Namen der Datei.
befehl null [Doppelpunkt] ist auch beim Debuggen nützlich, um den Wert der Variablen anzuzeigen
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
Es gibt BashSupport-Plugin für IntelliJ IDEA , das die Syntax überprüft.
Wenn Sie in einer Variablen die Gültigkeit aller Dateien in einem Verzeichnis benötigen (Git-Pre-Commit-Hook, Build-Lint-Skript), können Sie die stderr-Ausgabe der Befehle "sh -n" oder "bash -n" abfangen (siehe andere) Antworten) in einer Variablen und haben ein darauf basierendes "if/else"
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Ändern Sie "sh" mit "bash" je nach Ihren Bedürfnissen