diff --git a/Recursiveness.md b/Recursiveness.md index e66e3c9..c73dbfb 100644 --- a/Recursiveness.md +++ b/Recursiveness.md @@ -10,36 +10,32 @@ Script could have a `.sh` extension, no extension and have a range of shebang li The solution for this problem is to use `shellcheck` in combination with the `find` or `grep` command. -## Without exit code +## By extension -If you're not interested in the exit code of the `shellcheck` command, you can use (a variation) of one of the following commands: +To check files with one of multiple extensions: ``` -# Scan a complete folder (recursively) -find path/to/scripts -type f -exec "shellcheck" "--format=gcc" {} \; +# Bash 4+ +shopt -s globstar nullglob +shellcheck /path/to/scripts/**/*.{sh,bash,ksh} -# Scan a complete folder (recursively) for .sh files -find path/to/scripts -type f -name "*.sh" -exec "shellcheck" "--format=gcc" {} \; +# POSIX +find /path/to/scripts -type f \( -name "*.sh" -o -name "*.bash" -o -name "*.ksh" \) -print | + while IFS="" read -r file + do + shellcheck "$file" + done ``` -## With exit code +## By shebang -If you want to use `shellcheck` in some kind of testing pipeline, you want to know the exit code of the command. - -In this case you can test every matched file individually: +To check files whose shebang indicate that they are sh/bash/ksh scripts: ``` -# Scan a complete folder (recursively) -for file in $(find path/to/scripts -type f); do shellcheck --format=gcc $file; done; - -# Scan a complete folder (recursively) for .sh files -for file in $(find path/to/scripts -type f -name "*.sh"); do shellcheck --format=gcc $file; done; -``` - -## Finding files to test - -Since not all scripts have a `.sh` extension, you could use the shebang line of files to determine if they need to be tested (and with which format): - -``` -for file in $(grep -IRl "#\!\(/usr/bin/env \|/bin/\)sh" --exclude-dir "var" --exclude "*.txt"); do shellcheck --format=gcc --shell=sh $file; done; +# POSIX +find /path/to/scripts -type f -exec grep -Eq '^#!(.*/|.*env +)(sh|bash|ksh)' {} \; -print | + while IFS="" read -r file + do + shellcheck "$file" + done ``` \ No newline at end of file