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 hello
statt echo hello
.
set
dies tun .
if ["$var" == "string" ]
anstattif [ "$var" == "string" ]
type [
sagt "[ist eine eingebaute Shell". Es delegiert letztendlich an das test
Programm, 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 $var
es zu einer leeren Zeichenfolge erweitert wird . Wenn es $var
zu 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 „ test
Programm“ (externe Dienstprogramm): bash
, dash
, ksh
, zsh
haben alle eingebauten Versionen der beiden [
undtest
Und 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 -u
obwohl 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.sh
zeigt 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 0
Bestätigung ohne Fehler als erfolgreich zurückgeben.
Es hat bei mir gut funktioniert. Ich lief unter Linux OS, Bash Shell.
sh -n
wird wahrscheinlich nicht überprüfen, ob das Skript ein gültiges Bash-Skript ist. Es könnte falsche Negative geben. sh
ist 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 find
Tool 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.
.sh
oder 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