Ist es möglich, eine Bash-Skript-Syntax zu überprüfen, ohne sie auszuführen?
Mit Perl kann ich laufen perl -c 'script name'. Gibt es einen entsprechenden Befehl für Bash-Skripte?
Ist es möglich, eine Bash-Skript-Syntax zu überprüfen, ohne sie auszuführen?
Mit Perl kann ich laufen perl -c 'script name'. Gibt es einen entsprechenden Befehl für Bash-Skripte?
Antworten:
bash -n scriptname
Vielleicht eine offensichtliche Einschränkung: Dies bestätigt Syntax aber nicht überprüfen , ob Ihr Bash - Skript versucht , einen Befehl auszuführen , die nicht in Ihrem Pfad ist, wie ech hellostatt echo hello.
setdies tun .
if ["$var" == "string" ]anstattif [ "$var" == "string" ]
type [sagt "[ist eine eingebaute Shell". Es delegiert letztendlich an das testProgramm, erwartet aber auch eine schließende Klammer. Es ist also so, wie if test"$var"es der Autor nicht gemeint hat, aber syntaktisch gültig ist (sagen wir, $ var hat den Wert "a", dann sehen wir "bash: testa: Befehl nicht gefunden"). Punkt ist, dass syntaktisch kein Platz fehlt.
[wird in diesem Fall nur aufgerufen, wenn $vares zu einer leeren Zeichenfolge erweitert wird . Wenn es $varzu einer nicht leeren Zeichenfolge erweitert wird, [wird es mit dieser Zeichenfolge verkettet und von Bash als Befehlsname (nicht Funktionsname ) interpretiert. Ja, das ist syntaktisch gültig, aber, wie Sie sagen, offensichtlich nicht die Absicht. Wenn Sie [[anstelle von verwenden [, obwohl [[es sich um ein Shell- Schlüsselwort handelt (und nicht um ein integriertes Schlüsselwort), erhalten Sie dasselbe Ergebnis, da die unbeabsichtigte Verkettung von Zeichenfolgen die Erkennung des Schlüsselworts weiterhin überschreibt.
["$var"ist syntaktisch ein gültiger Befehlsnamenausdruck ; in ähnlicher Weise, Tokens ==und "$string"gelten Befehl Argumente . ( Im Allgemeinen builtin [mit geparst Befehlssyntax, während [[- als Schalen Schlüsselwort - anders analysiert wird.) Die Schale builtin [ist nicht übertragen auf das „ testProgramm“ (externe Dienstprogramm): bash, dash, ksh, zshhaben alle eingebauten Versionen der beiden [undtestUnd sie nicht nennen ihre Außen-Utility - Pendants.
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 Flusenwerkzeug für Sh / Bash-Skripte. Es konzentriert sich hauptsächlich auf die Behandlung typischer Syntaxfehler und Fallstricke für Anfänger und Fortgeschrittene, bei denen die Shell nur eine kryptische Fehlermeldung oder ein seltsames Verhalten ausgibt, berichtet jedoch auch über einige fortgeschrittenere Probleme, bei denen Eckfälle zu verzögerten Fehlern führen können.
Haskell-Quellcode ist auf GitHub verfügbar!
apt-get install shellcheck
trusty-backports.
Ich aktiviere auch die Option 'u' für jedes Bash-Skript, das ich schreibe, um zusätzliche Überprüfungen durchzuführen:
set -u
Dadurch 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 melden:
./check_init.sh[4]: mesage: Parameter nicht gesetzt.
Sehr nützlich, um Tippfehler zu fangen
set -uobwohl dies die Frage nicht wirklich beantwortet, da Sie das Skript ausführen müssen, um die Fehlermeldung zu erhalten. Nicht einmal bash -n check_init.shzeigt diese Warnung
sh -n script-name
Führen Sie dies 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 $?die 0Bestätigung ohne Fehler als erfolgreich zurückgeben.
Es hat bei mir gut funktioniert. Ich lief unter Linux OS, Bash Shell.
sh -nwird wahrscheinlich nicht überprüfen, ob das Skript ein gültiges Bash-Skript ist. Es könnte falsche Negative geben. shist eine Bourne-Shell-Variante, die normalerweise nicht Bash ist. Zum Beispiel in Ubuntu Linux realpath -e $(command -v sh)gibt / bin / dash
Ich überprüfe tatsächlich alle Bash-Skripte im aktuellen Verzeichnis auf Syntaxfehler, OHNE sie mit dem findTool 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.
Es gibt das BashSupport-Plugin für IntelliJ IDEA, das die Syntax überprüft.
.shoder einer anderen mit Bash-Skripten verknüpften Erweiterung enden. Dies ist der Fall, wenn Sie die Skripte mit einem Template-Tool wie ERB generieren (dann enden sie mit .erb). Bitte stimmen Sie für youtrack.jetbrains.com/issue/IDEA-79574 ab, wenn Sie dies beheben möchten!
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" abrufen (siehe andere) Antworten) in einer Variablen und haben ein "if / else" basierend darauf
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 Anforderungen