How do I syntax check a Bash script without running it?

LinuxBashUnixSyntaxGnu

Linux Problem Overview


Is it possible to check a bash script syntax without executing it?

Using Perl, I can run perl -c 'script name'. Is there any equivalent command for bash scripts?

Linux Solutions


Solution 1 - Linux

bash -n scriptname

Perhaps an obvious caveat: this validates syntax but won't check if your bash script tries to execute a command that isn't in your path, like ech hello instead of echo hello.

Solution 2 - Linux

Time changes everything. Here is a web site which provide online syntax checking for shell script.

I found it is very powerful detecting common errors.

enter image description here

About ShellCheck

ShellCheck is a static analysis and linting tool for sh/bash scripts. It's mainly focused on handling typical beginner and intermediate level syntax errors and pitfalls where the shell just gives a cryptic error message or strange behavior, but it also reports on a few more advanced issues where corner cases can cause delayed failures.

Haskell source code is available on GitHub!

Solution 3 - Linux

I also enable the 'u' option on every bash script I write in order to do some extra checking:

set -u 

This will report the usage of uninitialized variables, like in the following script 'check_init.sh'

#!/bin/sh
set -u
message=hello
echo $mesage

Running the script :

$ check_init.sh

Will report the following :

> ./check_init.sh[4]: mesage: Parameter not set.

Very useful to catch typos

Solution 4 - Linux

sh  -n   script-name 

Run this. If there are any syntax errors in the script, then it returns the same error message. If there are no errors, then it comes out without giving any message. You can check immediately by using echo $?, which will return 0 confirming successful without any mistake.

It worked for me well. I ran on Linux OS, Bash Shell.

Solution 5 - Linux

I actually check all bash scripts in current dir for syntax errors WITHOUT running them using find tool:

Example:

find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"

If you want to use it for a single file, just edit the wildcard with the name of the file.

Solution 6 - Linux

null command [colon] also useful when debugging to see variable's value

set -x
for i in {1..10}; do
	let i=i+1
	: i=$i
done
set - 

Solution 7 - Linux

Bash shell scripts will run a syntax check if you enable syntax checking with

set -o noexec

if you want to turn off syntax checking

set +o noexec

Solution 8 - Linux

There is BashSupport plugin for IntelliJ IDEA which checks the syntax.

Solution 9 - Linux

For only validating syntax: > shellcheck [programPath]

For running the program only if syntax passes, so debugging both syntax and execution: > shellproof [programPath]

Solution 10 - Linux

If you need in a variable the validity of all the files in a directory (git pre-commit hook, build lint script), you can catch the stderr output of the "sh -n" or "bash -n" commands (see other answers) in a variable, and have a "if/else" based on that

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

Change "sh" with "bash" depending on your needs

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTom FeinerView Question on Stackoverflow
Solution 1 - LinuxandyView Answer on Stackoverflow
Solution 2 - Linuxdvd818View Answer on Stackoverflow
Solution 3 - LinuxDiego TerceroView Answer on Stackoverflow
Solution 4 - LinuxJeevanView Answer on Stackoverflow
Solution 5 - LinuxGerald HughesView Answer on Stackoverflow
Solution 6 - Linuxmug896View Answer on Stackoverflow
Solution 7 - LinuxMikeView Answer on Stackoverflow
Solution 8 - LinuxCengizView Answer on Stackoverflow
Solution 9 - LinuxAlberto Salvia NovellaView Answer on Stackoverflow
Solution 10 - LinuxE CiottiView Answer on Stackoverflow