web-dev-qa-db-de.com

Wie überprüfe ich ein Bash-Skript in der Syntax, ohne es auszuführen?

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?

245
Tom Feiner
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.

352
andy

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.

enter image description here

Über ShellCheck

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!

118
dvd818

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

38
Diego Tercero
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.

24
Jeevan

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.

4
Gerald Hughes

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 - 
3
mug896

Es gibt BashSupport-Plugin für IntelliJ IDEA , das die Syntax überprüft.

1
Cengiz

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

1
Elvis Ciotti