www.shellcheck.net Open in urlscan Pro
23.251.146.157  Public Scan

URL: https://www.shellcheck.net/wiki/
Submission: On November 13 via manual from US — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

SHELLCHECK WIKI SITEMAP

The wiki is maintained on GitHub. This page is primarily for the benefit of
search engines.
 * Azure-Pipelines –
 * Buildkite –
 * CentOS6 –
 * Checks – Finding documentation for a check
 * CircleCI –
 * Contrib –
 * DevGuide – ShellCheck Dev Guide
 * Directive – ShellCheck directives
 * Drone –
 * GitHub-Actions – Differential ShellCheck
 * GitLab-CI –
 * Home – Welcome to the ShellCheck wiki!
 * Ignore – Ignoring errors
 * Integration – Integrating with ShellCheck
 * JUnit – Getting JUnit XML from ShellCheck
 * More-Installation-Guides – Installing ShellCheck on CentOS 6 / RHEL6
 * Optional – Optional checks
 * Parser-error –
 * Phabricator – Installation
 * Recursiveness –
 * SC1000 – `$` is not used specially and should therefore be escaped.
 * SC1001 – This `\o` will be a regular 'o' in this context.
 * SC1003 – Want to escape a single quote? `echo 'This is how it'\''s done'`.
 * SC1004 – This backslash+linefeed is literal. Break outside single quotes if
   you just want to break the line.
 * SC1007 – Remove space after `=` if trying to assign a value (or for empty
   string, use `var=''` ... ).
 * SC1008 – This shebang was unrecognized. ShellCheck only supports
   sh/bash/dash/ksh. Add a 'shell' directive to specify.
 * SC1009 – The mentioned parser error was in ...
 * SC1010 – Use semicolon or linefeed before `done` (or quote to make it
   literal).
 * SC1011 – This apostrophe terminated the single quoted string!
 * SC1012 – `\t` is just literal `t` here. For tab, use `"$(printf '\t')"`
   instead.
 * SC1014 – Use `if cmd; then ..` to check exit code, or `if [ "$(cmd)" = .. ]`
   to check output.
 * SC1015 – This is a unicode double quote. Delete and retype it.
 * SC1016 – This is a Unicode single quote. Delete and retype it.
 * SC1017 – Literal carriage return. Run script through `tr -d '\r'` .
 * SC1018 – This is a unicode non-breaking space. Delete it and retype as space.
 * SC1019 – Expected this to be an argument to the unary condition.
 * SC1020 – You need a space before the `]` or `]]`
 * SC1026 – If grouping expressions inside `[[..]]`, use `( .. )`.
 * SC1027 – Expected another argument for this operator.
 * SC1028 – In `[..]` you have to escape `\( \)` or preferably combine `[..]`
   expressions.
 * SC1029 – In `[[..]]` you shouldn't escape `(` or `)`.
 * SC1033 – Test expression was opened with double `[[` but closed with single
   `]`. Make sure they match.
 * SC1034 – Test expression was opened with double `[` but closed with single
   `]]`. Make sure they match.
 * SC1035 – You need a space here
 * SC1036 – `(` is invalid here. Did you forget to escape it?
 * SC1037 – Braces are required for positionals over 9, e.g. `${10}`.
 * SC1038 – Shells are space sensitive. Use `< <(cmd)`, not `<<(cmd)`.
 * SC1039 – Remove indentation before end token (or use `<<-` and indent with
   tabs).
 * SC1040 – When using `<<-`, you can only indent with tabs.
 * SC1041 – Found `eof` further down, but not on a separate line.
 * SC1043 – Found EOF further down, but with wrong casing.
 * SC1044 – Couldn't find end token `EOF` in the here document.
 * SC1045 – It's not `foo &; bar`, just `foo & bar`.
 * SC1046 – Couldn't find `fi` for this `if`.
 * SC1047 – Expected `fi` matching previously mentioned `if`.
 * SC1048 – Can't have empty then clauses (use `true` as a no-op).
 * SC1049 – Did you forget the `then` for this `if`?
 * SC1050 – Expected `then`.
 * SC1051 – Semicolons directly after `then` are not allowed. Just remove it.
 * SC1052 – Semicolons directly after `then` are not allowed. Just remove it.
 * SC1053 – Semicolons directly after `else` are not allowed. Just remove it.
 * SC1054 – You need a space after the `{`.
 * SC1055 – You need at least one command here. Use `true;` as a no-op.
 * SC1056 – Expected a `}`. If you have one, try a `;` or `\n` in front of it.
 * SC1057 – Did you forget the `do` for this loop?
 * SC1058 – Expected `do`.
 * SC1059 – Semicolon is not allowed directly after `do`. You can just delete
   it.
 * SC1060 – Can't have empty do clauses (use `true` as a no-op)
 * SC1061 – Couldn't find `done` for this `do`.
 * SC1062 – Expected `done` matching previously mentioned `do`.
 * SC1063 – You need a line feed or semicolon before the `do`.
 * SC1064 – Expected a `{` to open the function definition.
 * SC1065 – Trying to declare parameters? Don't. Use `()` and refer to params as
   `$1`, `$2`, ..
 * SC1066 – Don't use `$` on the left side of assignments.
 * SC1067 – For indirection, use arrays, `declare "var$n=value"`, or (for sh)
   `read`/`eval`
 * SC1068 – Don't put spaces around the `=` in assignments.
 * SC1069 – You need a space before the `[`.
 * SC107 – !/usr/bin/env bash
 * SC1070 – Parsing stopped here. Mismatched keywords or invalid parentheses?
 * SC1071 – ShellCheck only supports sh/bash/dash/ksh scripts. Sorry!
 * SC1072 – Unexpected ..
 * SC1073 – Couldn't parse this (thing). Fix to allow more checks.
 * SC1074 – Did you forget the `;;` after the previous case item?
 * SC1075 – Use `elif` instead of `else if`.
 * SC1076 – Trying to do math? Use e.g. `[ $((i/2+7)) -ge 18 ]`.
 * SC1077 – For command expansion, the tick should slant left (`` ` `` vs `´`).
 * SC1078 – Did you forget to close this double quoted string?
 * SC1079 – This is actually an end quote, but due to next char it looks
   suspect.
 * SC1080 – You need `\` before line feeds to break lines in `[ ]`.
 * SC1081 – Scripts are case-sensitive. Use `if`, not `If`.
 * SC1082 – This file has a UTF-8 BOM. Remove it with: `LC_CTYPE=C sed
   '1s/^...//' < yourscript`.
 * SC1083 – This `{`/`}` is literal. Check if `;` is missing or quote the
   expression.
 * SC1084 – Use `#!`, not `!#`, for the shebang.
 * SC1086 – Don't use `$` on the iterator name in for loops.
 * SC1087 – Use braces when expanding arrays, e.g. `${array[idx]}` (or
   `${var}[..` to quiet).
 * SC1088 – Parsing stopped here. Invalid use of parentheses?
 * SC1089 – Parsing stopped here. Is this keyword correctly matched up?
 * SC1090 – Can't follow non-constant source. Use a directive to specify
   location.
 * SC1091 – Not following: (error message here)
 * SC1092 – Stopping at 100 `source` frames :O
 * SC1094 – Parsing of sourced file failed. Ignoring it.
 * SC1095 – You need a space or linefeed between the function name and body.
 * SC1097 – Unexpected `==`. For assignment, use `=`. For comparison, use
   `[`/`[[`.
 * SC1098 – Quote/escape special characters when using `eval`, e.g. `eval
   "a=(b)"`.
 * SC1099 – You need a space before the `#`.
 * SC1100 – This is a unicode dash. Delete and retype as ASCII minus.
 * SC1101 – Delete trailing spaces after `\` to break line (or use quotes for
   literal space).
 * SC1102 – Shells disambiguate `$((` differently or not at all. For `$(command
   substitution)`, add space after `$(` . For `$((arithmetics))`, fix parsing
   errors.
 * SC1103 – This shell type is unknown. Use e.g. `sh` or `bash`.
 * SC1104 – Use `#!`, not just `!`, for the shebang.
 * SC1105 – Shells disambiguate `((` differently or not at all. If the first `(`
   should start a subshell, add a space after it.
 * SC1106 – In arithmetic contexts, use `<` instead of `-lt`
 * SC1107 – This directive is unknown. It will be ignored.
 * SC1108 – You need a space before and after the `=` .
 * SC1109 – This is an unquoted HTML entity. Replace with corresponding
   character.
 * SC1110 – This is a unicode quote. Delete and retype it (or quote to make
   literal).
 * SC1111 – This is a unicode quote. Delete and retype it (or ignore/singlequote
   for literal).
 * SC1112 – This is a unicode quote. Delete and retype it (or ignore/doublequote
   for literal).
 * SC1113 – Use `#!`, not just `#`, for the shebang.
 * SC1114 – Remove leading spaces before the shebang.
 * SC1115 – Remove spaces between `#` and `!` in the shebang.
 * SC1116 – Missing `$` on a `$((..))` expression? (or use `( (` for arrays).
 * SC1117 – Backslash is literal in `"\n"`. Prefer explicit escaping: `"\\n"`.
 * SC1118 – Delete whitespace after the here-doc end token.
 * SC1119 – Add a linefeed between end token and terminating `)`.
 * SC1120 – No comments allowed after here-doc token. Comment the next line
   instead.
 * SC1121 – Add `;`/`&` terminators (and other syntax) on the line with the
   `<<`, not here.
 * SC1122 – Nothing allowed after end token. To continue a command, put it on
   the line with the `<<`.
 * SC1123 – ShellCheck directives are only valid in front of complete compound
   commands, like `if`, not e.g. individual `elif` branches.
 * SC1124 – ShellCheck directives are only valid in front of complete commands
   like `case` statements, not individual case branches.
 * SC1125 – Invalid `key=value` pair in directive
 * SC1126 – Place shellcheck directives before commands, not after.
 * SC1127 – Was this intended as a comment? Use `#` in sh.
 * SC1128 – The shebang must be on the first line. Delete blanks and move
   comments.
 * SC1129 – You need a space before the `!`.
 * SC1130 – You need a space before the :.
 * SC1131 – Use `elif` to start another branch.
 * SC1132 – This `&` terminates the command. Escape it or add space after `&` to
   silence.
 * SC1133 – Unexpected start of line. If breaking lines, `|`/`||`/`&&` should be
   at the end of the previous one.
 * SC1134 –
 * SC1135 – Prefer escape over ending quote to make `$` literal. Instead of `"It
   costs $"5`, use `"It costs \$5"`
 * SC1136 – Unexpected characters after terminating `]`. Missing
   semicolon/linefeed?
 * SC1137 – Missing second `(` to start arithmetic for ((;;)) loop
 * SC1138 – Shells are space sensitive. Use `< <(cmd)`, not `<< (cmd)`.
 * SC1139 – Use `||` instead of `-o` between test commands.
 * SC1140 – Unexpected parameters after condition. Missing `&&`/`||`, or bad
   expression?
 * SC1141 – Unexpected tokens after compound command. Bad redirection or missing
   `;`/`&&`/`||`/`|`?
 * SC1142 – Use `done < <(cmd)` to redirect from process substitution (currently
   missing one `<`).
 * SC1143 – This backslash is part of a comment and does not continue the line.
 * SC1144 – `external-sources` can only be enabled in .shellcheckrc, not in
   individual files.
 * SC1145 – Unknown `external-sources` value. Expected `true`/`false`.
 * SC2000 – See if you can use `${#variable}` instead
 * SC2001 – See if you can use `${variable//search/replace}` instead.
 * SC2002 – Useless cat. Consider `cmd < file | ..` or `cmd file | ..` instead.
 * SC2003 – expr is antiquated. Consider rewriting this using `$((..))`, `${}`
   or `[[ ]]`.
 * SC2004 – `$`/`${}` is unnecessary on arithmetic variables.
 * SC2005 –
 * SC2006 – Use `$(...)` notation instead of legacy backticked `` `...` ``.
 * SC2007 – Use `$((..))` instead of deprecated `$[..]`.
 * SC2008 – `echo` doesn't read from stdin, are you sure you should be piping to
   it?
 * SC2009 – Consider using `pgrep` instead of grepping `ps` output.
 * SC2010 – Don't use `ls | grep`. Use a glob or a for loop with a condition to
   allow non-alphanumeric filenames.
 * SC2011 – Use `find -print0` or `find -exec` to better handle non-alphanumeric
   filenames.
 * SC2012 – Use `find` instead of `ls` to better handle non-alphanumeric
   filenames.
 * SC2013 – To read lines rather than words, pipe/redirect to a `while read`
   loop.
 * SC2014 – This will expand once before find runs, not per file found.
 * SC2015 – Note that `A && B || C` is not if-then-else. C may run when A is
   true.
 * SC2016 – Expressions don't expand in single quotes, use double quotes for
   that.
 * SC2017 – Increase precision by replacing `a/b*c` with `a*c/b`.
 * SC2018 – Use `[:lower:]` to support accents and foreign alphabets.
 * SC2019 – Use `[:upper:]` to support accents and foreign alphabets.
 * SC2020 – `tr` replaces sets of chars, not words (mentioned due to
   duplicates).
 * SC2021 – Don't use `[]` around ranges in `tr`, it replaces literal square
   brackets.
 * SC2022 – Note that unlike globs, `o*` here matches `ooo` but not `oscar`.
 * SC2023 – The shell may override `time` as seen in man time(1). Use `command
   time ..` for that one.
 * SC2024 – `sudo` doesn't affect redirects. Use `..| sudo tee file`
 * SC2025 – Make sure all escape sequences are enclosed in `\[..\]` to prevent
   line wrapping issues.
 * SC2026 – This word is outside of quotes. Did you intend to `'nest '"'single
   quotes'"'` instead'?
 * SC2027 – The surrounding quotes actually unquote this. Remove or escape them.
 * SC2028 – `echo` won't expand escape sequences. Consider `printf`.
 * SC2029 – Note that, unescaped, this expands on the client side.
 * SC2030 – Modification of var is local (to subshell caused by pipeline).
 * SC2031 – var was modified in a subshell. That change might be lost.
 * SC2032 – This function can't be invoked via su on line 42.
 * SC2033 – Shell functions can't be passed to external commands. Use separate
   script or sh -c.
 * SC2034 – foo appears unused. Verify it or export it.
 * SC2035 – Use `./*glob*` or `-- *glob*` so names with dashes won't become
   options.
 * SC2036 – If you wanted to assign the output of the pipeline, use `a=$(b | c)`
   .
 * SC2037 – To assign the output of a command, use `var=$(cmd)` .
 * SC2038 – Use `-print0`/`-0` or `find -exec +` to allow for non-alphanumeric
   filenames.
 * SC2039 – In POSIX sh, *something* is undefined.
 * SC2040 – `#!/bin/sh` was specified, so ____ is not supported, even when sh is
   actually bash.
 * SC2041 – This is a literal string. To run as a command, use `$(..)` instead
   of `'..'` .
 * SC2042 – Use spaces, not commas, to separate loop elements.
 * SC2043 – This loop will only ever run once for a constant value. Did you
   perhaps mean to loop over `dir/*`, `$var` or `$(cmd)`?
 * SC2044 – For loops over find output are fragile. Use `find -exec` or a `while
   read` loop.
 * SC2045 – Iterating over ls output is fragile. Use globs.
 * SC2046 – Quote this to prevent word splitting.
 * SC2048 – Use `"$@"` (with quotes) to prevent whitespace problems.
 * SC2049 – `=~` is for regex, but this looks like a glob. Use `=` instead.
 * SC2050 – This expression is constant. Did you forget the `$` on a variable?
 * SC2051 – Bash doesn't support variables in brace range expansions.
 * SC2053 – Quote the rhs of `=` in `[[ ]]` to prevent glob matching.
 * SC2054 – Use spaces, not commas, to separate array elements.
 * SC2055 – You probably wanted `&&` here, otherwise it's always true.
 * SC2056 – You probably wanted `&&` here
 * SC2057 – Unknown binary operator.
 * SC2058 – Unknown unary operator.
 * SC2059 – Don't use variables in the `printf` format string. Use `printf
   "..%s.." "$foo"`.
 * SC2060 – Quote parameters to tr to prevent glob expansion.
 * SC2061 – Quote the parameter to `-name` so the shell won't interpret it.
 * SC2062 – Quote the grep pattern so the shell won't interpret it.
 * SC2063 – Grep uses regex, but this looks like a glob.
 * SC2064 – Use single quotes, otherwise this expands now rather than when
   signalled.
 * SC2065 – This is interpreted as a shell file redirection, not a comparison.
 * SC2066 – Since you double quoted this, it will not word split, and the loop
   will only run once.
 * SC2067 – Missing `;` or `+` terminating `-exec`. You can't use `|`/`||`/`&&`,
   and `;` has to be a separate, quoted argument.
 * SC2068 – Double quote array expansions to avoid re-splitting elements.
 * SC2069 – To redirect stdout+stderr, `2>&1` must be last (or use `{ cmd >
   file; } 2>&1` to clarify).
 * SC2070 – `-n` doesn't work with unquoted arguments. Quote or use `[[ ]]`.
 * SC2071 – `>` is for string comparisons. Use `-gt` instead.
 * SC2072 – Decimals are not supported. Either use integers only, or use `bc` or
   `awk` to compare.
 * SC2073 – Escape `\<` to prevent it redirecting (or switch to `[[ .. ]]`).
 * SC2074 – Can't use `=~` in `[ ]`. Use `[[..]]` instead.
 * SC2075 – Escaping `\<` is required in `[..]`, but invalid in `[[..]]`
 * SC2076 – Don't quote rhs of `=~`, it'll match literally rather than as a
   regex.
 * SC2077 – You need spaces around the comparison operator.
 * SC2078 – This expression is constant. Did you forget a `$` somewhere?
 * SC2079 – `(( ))` doesn't support decimals. Use `bc` or `awk`.
 * SC2080 – Numbers with leading 0 are considered octal.
 * SC2081 – `[ .. ]` can't match globs. Use `[[ .. ]]` or grep.
 * SC2082 – To expand via indirection, use `name="foo$n"; echo "${!name}"`.
 * SC2083 – Don't add spaces after the slash in `./file`.
 * SC2084 – Remove `$` or use `_=$((expr))` to avoid executing output.
 * SC2087 – Quote `EOF` to make here document expansions happen on the server
   side rather than on the client.
 * SC2088 – Tilde does not expand in quotes. Use `$HOME`.
 * SC2089 – Quotes/backslashes will be treated literally. Use an array.
 * SC2090 – Quotes/backslashes in this variable will not be respected.
 * SC2091 – Remove surrounding `$()` to avoid executing output (or use `eval` if
   intentional).
 * SC2092 – Remove backticks to avoid executing output.
 * SC2093 – Remove `exec ` if script should continue after this command.
 * SC2094 – Make sure not to read and write the same file in the same pipeline.
 * SC2095 – Use `ssh -n` to prevent ssh from swallowing stdin.
 * SC2096 – On most OS, shebangs can only specify a single parameter.
 * SC2097 – This assignment is only seen by the forked process.
 * SC2098 – This expansion will not see the mentioned assignment.
 * SC2099 – Use `$((..))` for arithmetics, e.g. `i=$((i + 2))`
 * SC2100 – Use `$((..))` for arithmetics, e.g. `i=$((i + 2))`
 * SC2101 – Named class needs outer `[]`, e.g. `[[:digit:]]`.
 * SC2102 – Ranges can only match single chars (mentioned due to duplicates).
 * SC2103 – Use a `( subshell )` to avoid having to `cd` back.
 * SC2104 – In functions, use `return` instead of `break`.
 * SC2105 – `break` is only valid in loops
 * SC2106 – This only exits the subshell caused by the pipeline.
 * SC2107 – Instead of `[ a && b ]`, use `[ a ] && [ b ]`.
 * SC2108 – In `[[..]]`, use `&&` instead of `-a`.
 * SC2109 – Instead of `[ a || b ]`, use `[ a ] || [ b ]`.
 * SC2110 – In `[[..]]`, use `||` instead of `-o`.
 * SC2111 – ksh does not allow `function` keyword and `()` at the same time.
 * SC2112 – `function` keyword is non-standard. Delete it.
 * SC2113 – `function` keyword is non-standard. Use `foo()` instead of `function
   foo`.
 * SC2114 – Warning: deletes a system directory.
 * SC2115 – Use `"${var:?}"` to ensure this never expands to `/*` .
 * SC2116 – Useless echo? Instead of `cmd $(echo foo)`, just use `cmd foo`.
 * SC2117 – To run commands as another user, use `su -c` or `sudo`.
 * SC2118 – Ksh does not support `|&`. Use `2>&1 |`
 * SC2119 – Use `foo "$@"` if function's `$1` should mean script's `$1`.
 * SC2120 – foo references arguments, but none are ever passed.
 * SC2121 – To assign a variable, use just `var=value`, not `set ..`.
 * SC2122 – `>=` is not a valid operator. Use `! a < b` instead.
 * SC2123 – `PATH` is the shell search path. Use another name.
 * SC2124 – Assigning an array to a string! Assign as array, or use `*` instead
   of `@` to concatenate.
 * SC2125 – Brace expansions and globs are literal in assignments. Quote it or
   use an array.
 * SC2126 – Consider using `grep -c` instead of `grep | wc`
 * SC2127 – To use `${ ..; }`, specify `#!/usr/bin/env ksh`.
 * SC2128 – Expanding an array without an index only gives the element in the
   index 0.
 * SC2129 – Consider using `{ cmd1; cmd2; } >> file` instead of individual
   redirects.
 * SC2130 – `-eq` is for integer comparisons. Use `=` instead.
 * SC2139 – This expands when defined, not when used. Consider escaping.
 * SC2140 – Word is of the form `"A"B"C"` (B indicated). Did you mean `"ABC"` or
   `"A\\"B\\"C"`?
 * SC2141 – Did you mean `IFS=$'\t'` ?
 * SC2142 – Aliases can't use positional parameters. Use a function.
 * SC2143 – Use `grep -q` instead of comparing output with `[ -n .. ]`.
 * SC2144 – `-e` doesn't work with globs. Use a `for` loop.
 * SC2145 – Argument mixes string and array. Use `*` or separate argument.
 * SC2146 – This action ignores everything before the `-o`. Use `\( \)` to
   group.
 * SC2147 – Literal tilde in PATH works poorly across programs.
 * SC2148 – Tips depend on target shell and yours is unknown. Add a shebang.
 * SC2149 – Remove `$`/`${}` for numeric index, or escape it for string.
 * SC2150 – `-exec` does not automatically invoke a shell. Use `-exec sh -c ..`
   for that.
 * SC2151 – Only one integer 0-255 can be returned. Use stdout for other data.
 * SC2152 – Can only return 0-255. Other data should be written to stdout.
 * SC2153 – Possible Misspelling: MYVARIABLE may not be assigned. Did you mean
   MY_VARIABLE?
 * SC2154 – var is referenced but not assigned.
 * SC2155 – Declare and assign separately to avoid masking return values.
 * SC2156 – Injecting filenames is fragile and insecure. Use parameters.
 * SC2157 – Argument to implicit `-n` is always true due to literal strings.
 * SC2158 – `[ false ]` is true. Remove the brackets
 * SC2159 – `[ 0 ]` is true. Use `false` instead.
 * SC2160 – Instead of `[ true ]`, just use `true`.
 * SC2161 – Instead of `[ 1 ]`, use `true`.
 * SC2162 – `read` without `-r` will mangle backslashes.
 * SC2163 – This does not export `FOO`. Remove `$`/`${}` for that, or use
   `${var?}` to quiet.
 * SC2164 – Use `cd ... || exit` in case `cd` fails.
 * SC2165 – This nested loop overrides the index variable of its parent.
 * SC2166 – Prefer `[ p ] && [ q ]` as `[ p -a q ]` is not well defined.
 * SC2167 – This parent loop has its index variable overridden.
 * SC2168 – `local` is only valid in functions.
 * SC2169 – In dash, *something* is not supported.
 * SC2170 – Invalid number for `-eq`. Use `=` to compare as string (or use
   `$var` to expand as a variable).
 * SC2171 – Found trailing `]` outside test. Add missing `[` or quote if
   intentional.
 * SC2172 – Trapping signals by number is not well defined. Prefer signal names.
 * SC2173 – SIGKILL/SIGSTOP can not be trapped.
 * SC2174 – When used with `-p`, `-m` only applies to the deepest directory.
 * SC2175 – Quote this invalid brace expansion since it should be passed
   literally to eval
 * SC2176 – `time` is undefined for pipelines. time single stage or `bash -c`
   instead.
 * SC2177 – `time` is undefined for compound commands, use `time sh -c` instead.
 * SC2178 – Variable was used as an array but is now assigned a string.
 * SC2179 – Use `array+=("item")` to append items to an array.
 * SC2180 – Bash does not support multidimensional arrays. Use 1D or associative
   arrays.
 * SC2181 – Check exit code directly with e.g. `if mycmd;`, not indirectly with
   `$?`.
 * SC2182 – This printf format string has no variables. Other arguments are
   ignored.
 * SC2183 – This format string has 2 variables, but is passed 1 arguments.
 * SC2184 – Quote arguments to unset so they're not glob expanded.
 * SC2185 – Some finds don't have a default path. Specify `.` explicitly.
 * SC2186 – tempfile is deprecated. Use mktemp instead.
 * SC2187 – Ash scripts will be checked as Dash. Add `# shellcheck shell=dash`
   to silence.
 * SC2188 – This redirection doesn't have a command. Move to its command (or use
   `true` as no-op).
 * SC2189 – You can't have `|` between this redirection and the command it
   should apply to.
 * SC2190 – Elements in associative arrays need index, e.g. `array=(
   [index]=value )` .
 * SC2191 – The `=` here is literal. To assign by index, use `( [index]=value )`
   with no spaces. To keep as literal, quote it.
 * SC2192 – This array element has no value. Remove spaces after `=` or use `""`
   for empty string.
 * SC2193 – The arguments to this comparison can never be equal. Make sure your
   syntax is correct.
 * SC2194 – This word is constant. Did you forget the `$` on a variable?
 * SC2195 – This pattern will never match the case statement's word. Double
   check them.
 * SC2196 – `egrep` is non-standard and deprecated. Use `grep -E` instead.
 * SC2197 – `fgrep` is non-standard and deprecated. Use `grep -F` instead.
 * SC2198 – Arrays don't work as operands in `[ ]`. Use a loop (or concatenate
   with `*` instead of `@`).
 * SC2199 – Arrays implicitly concatenate in `[[ ]]`. Use a loop (or explicit
   `*` instead of `@`).
 * SC2200 – Brace expansions don't work as operands in `[ ]`. Use a loop.
 * SC2201 – Brace expansion doesn't happen in `[[ ]]`. Use a loop.
 * SC2202 – Globs don't work as operands in `[ ]`. Use a loop.
 * SC2203 – Globs are ignored in `[[ ]]` except right of `=`/`!=`. Use a loop.
 * SC2204 – `(..)` is a subshell. Did you mean `[ .. ]`, a test expression?
 * SC2205 – `(..)` is a subshell. Did you mean `[ .. ]`, a test expression?
 * SC2206 – Quote to prevent word splitting/globbing, or split robustly with
   mapfile or `read -a`.
 * SC2207 – Prefer `mapfile` or `read -a` to split command output (or quote to
   avoid splitting).
 * SC2208 – Use `[[ ]]` or quote arguments to `-v` to avoid glob expansion.
 * SC2209 – Use `var=$(command)` to assign output (or quote to assign string).
 * SC2210 – This is a file redirection. Was it supposed to be a comparison or fd
   operation?
 * SC2211 – This is a glob used as a command name. Was it supposed to be in
   `${..}`, array, or is it missing quoting?
 * SC2212 – Use `false` instead of empty `[`/`[[` conditionals.
 * SC2213 – getopts specified `-n`, but it's not handled by this `case`.
 * SC2214 – This case is not specified by getopts.
 * SC2215 – This flag is used as a command name. Bad line break or missing `[ ..
   ]`?
 * SC2216 – Piping to `rm`, a command that doesn't read stdin. Wrong command or
   missing `xargs`?
 * SC2217 – Redirecting to `echo`, a command that doesn't read stdin. Bad
   quoting or missing `xargs`?
 * SC2218 – This function is only defined later. Move the definition up.
 * SC2219 – Instead of `let expr`, prefer `(( expr ))` .
 * SC2220 – Invalid flags are not handled. Add a `*)` case.
 * SC2221 – This pattern always overrides a later one.
 * SC2222 – This pattern never matches because of a previous pattern.
 * SC2223 – This default assignment may cause DoS due to globbing. Quote it.
 * SC2224 – This `mv` has no destination. Check the arguments.
 * SC2225 – This `cp` has no destination. Check the arguments.
 * SC2226 – This `ln` has no destination. Check the arguments, or specify `.`
   explicitly.
 * SC2227 – Redirection applies to the find command itself. Rewrite to work per
   action (or move to end).
 * SC2229 – This does not read `foo`. Remove `$`/`${}` for that, or use
   `${var?}` to quiet.
 * SC2230 – `which` is non-standard. Use builtin `command -v` instead.
 * SC2231 – Quote expansions in this `for` loop glob to prevent wordsplitting,
   e.g. `"$dir"/*.txt` .
 * SC2232 – Can't use `sudo` with builtins like `cd`. Did you want `sudo sh -c
   ..` instead?
 * SC2233 – Remove superfluous `(..)` around condition to avoid subshell
   overhead.
 * SC2234 – Remove superfluous `(..)` around test command to avoid subshell
   overhead.
 * SC2235 – Use `{ ..; }` instead of `(..)` to avoid subshell overhead.
 * SC2236 – Use `-n` instead of `! -z`.
 * SC2237 – Use `[ -n .. ]` instead of `! [ -z .. ]`.
 * SC2238 – Redirecting to/from command name instead of file. Did you want
   pipes/xargs (or quote to ignore)?
 * SC2239 – Ensure the shebang uses the absolute path to the interpreter.
 * SC2240 – The dot command does not support arguments in sh/dash. Set them as
   variables.
 * SC2241 – The exit status can only be one integer 0-255. Use stdout for other
   data.
 * SC2242 – Can only exit with status 0-255. Other data should be written to
   stdout/stderr.
 * SC2243 – Prefer explicit `-n` to check for output (or run command without
   `[`/`[[` to check for success)
 * SC2244 – Prefer explicit `-n` to check non-empty string (or use `=`/`-ne` to
   check boolean/integer).
 * SC2245 – -d only applies to the first expansion of this glob. Use a loop to
   check any/all.
 * SC2246 – This shebang specifies a directory. Ensure the interpreter is a
   file.
 * SC2247 – Flip leading `$` and `"` if this should be a quoted substitution.
 * SC2248 – Prefer double quoting even when variables don't contain special
   characters.
 * SC2249 – Consider adding a default `*)` case, even if it just exits with
   error.
 * SC2250 – Prefer putting braces around variable references even when not
   strictly required.
 * SC2251 – This `!` is not on a condition and skips errexit. Use `&& exit 1`
   instead, or make sure `$?` is checked.
 * SC2252 – You probably wanted `&&` here, otherwise it's always true.
 * SC2253 – Use `-R` to recurse, or explicitly `a-r` to remove read permissions.
 * SC2254 – Quote expansions in case patterns to match literally rather than as
   a glob.
 * SC2255 – `[ ]` does not apply arithmetic evaluation. Evaluate with `$((..))`
   for numbers, or use string comparator for strings.
 * SC2256 – This translated string is the name of a variable. Flip leading `$`
   and `"` if this should be a quoted substitution.
 * SC2257 – Arithmetic modifications in command redirections may be discarded.
   Do them separately.
 * SC2259 – This redirection overrides piped input. To use both, merge or pass
   filenames.
 * SC2260 – This redirection overrides the output pipe. Use `tee` to output to
   both.
 * SC2261 – Multiple redirections compete for stdout. Use `cat`, `tee`, or pass
   filenames instead.
 * SC2262 – This alias can't be defined and used in the same parsing unit. Use a
   function instead.
 * SC2263 – Since they're in the same parsing unit, this command will not refer
   to the previously mentioned alias.
 * SC2264 – This function unconditionally re-invokes itself. Missing `command`?
 * SC2265 – Use && for logical AND. Single & will background and return true.
 * SC2266 – Use && for logical AND. Single & will background and return true.
 * SC2267 – GNU `xargs -i` is deprecated in favor of `-I{}`
 * SC2268 – Avoid x-prefix in comparisons as it no longer serves a purpose.
 * SC2269 – This variable is assigned to itself, so the assignment does nothing.
 * SC2270 – To assign positional parameters, use `set -- first second ..` (or
   use `[ ]` to compare).
 * SC2271 – For indirection, use arrays, `declare "var$n=value"`, or (for sh)
   read/eval
 * SC2272 – Command name contains `==`. For comparison, use `[ "$var" = value
   ]`.
 * SC2273 – Sequence of `===`s found. Merge conflict or intended as a commented
   border?
 * SC2274 – Command name starts with `===`. Intended as a commented border?
 * SC2275 – Command name starts with `=`. Bad line break?
 * SC2276 – This is interpreted as a command name containing `=`. Bad assignment
   or comparison?
 * SC2277 – Use `BASH_ARGV0` to assign to `$0` in bash (or use `[ ]` to
   compare).
 * SC2278 – `$0` can't be assigned in Ksh (but it does reflect the current
   function).
 * SC2279 – `$0` can't be assigned in Dash. This becomes a command name.
 * SC2280 – `$0` can't be assigned this way, and there is no portable
   alternative.
 * SC2281 – Don't use `$`/`${}` on the left side of assignments.
 * SC2282 – Variable names can't start with numbers, so this is interpreted as a
   command.
 * SC2283 – Use `[ ]` to compare values, or remove spaces around `=` to assign
   (or quote `'='` if literal).
 * SC2284 – Use `[ x = y ]` to compare values (or quote `'=='` if literal).
 * SC2285 – Remove spaces around `+=` to assign (or quote `'+='` if literal).
 * SC2286 – This empty string is interpreted as a command name. Double check
   syntax (or use 'true' as a no-op).
 * SC2287 – This is interpreted as a command name ending with '/'. Double check
   syntax.
 * SC2288 – This is interpreted as a command name ending with apostrophe. Double
   check syntax.
 * SC2289 – This is interpreted as a command name containing a linefeed. Double
   check syntax.
 * SC2290 – Remove spaces around = to assign.
 * SC2291 – Quote repeated spaces to avoid them collapsing into one.
 * SC2292 – Prefer `[[ ]]` over `[ ]` for tests in Bash/Ksh.
 * SC2293 – When eval'ing @Q-quoted words, use * rather than @ as the index.
 * SC2294 – eval negates the benefit of arrays. Drop eval to preserve
   whitespace/symbols (or eval as string).
 * SC2295 – Expansions inside `${..}` need to be quoted separately, otherwise
   they will match as a pattern.
 * SC2296 – Parameter expansions can't start with `{`. Double check syntax.
 * SC2297 – Double quotes must be outside `${}`: `${"invalid"}` vs `"${valid}"`.
 * SC2298 – `${$x}` is invalid. For expansion, use ${x}. For indirection, use
   arrays, ${!x} or (for sh) eval.
 * SC2299 – Parameter expansions can't be nested. Use temporary variables.
 * SC2300 – Parameter expansion can't be applied to command substitutions. Use
   temporary variables.
 * SC2301 – Parameter expansion starts with unexpected quotes. Double check
   syntax.
 * SC2302 – This loops over values. To loop over keys, use `"${!array[@]}"`.
 * SC2303 – `i` is an array value, not a key. Use directly or loop over keys
   instead.
 * SC2304 – `*` must be escaped to multiply: `\*`. Modern `$((x * y))` avoids
   this issue.
 * SC2305 – Quote regex argument to expr to avoid it expanding as a glob.
 * SC2306 – Escape glob characters in arguments to expr to avoid pathname
   expansion.
 * SC2307 – 'expr' expects 3+ arguments but sees 1. Make sure each
   operator/operand is a separate argument, and escape <>&|.
 * SC2308 – `expr length` has unspecified results. Prefer `${#var}`.
 * SC2309 – -eq treats this as a variable. Use = to compare as string (or expand
   explicitly with $var)
 * SC2310 – This function is invoked in an 'if' condition so set -e will be
   disabled. Invoke separately if failures should cause the script to exit.
 * SC2311 – Bash implicitly disabled set -e for this function invocation because
   it's inside a command substitution. Add set -e; before it or enable
   inherit_errexit.
 * SC2312 – Consider invoking this command separately to avoid masking its
   return value (or use '|| true' to ignore).
 * SC2313 – Quote array indices to avoid them expanding as globs.
 * SC2314 – In bats, `!` does not cause a test failure.
 * SC2315 – In bats, `!` does not cause a test failure. Fold the `!` into the
   conditional!
 * SC2316 – This applies local to the variable named readonly, which is probably
   not what you want. Use a separate command or the appropriate `declare`
   options instead.
 * SC2317 – Command appears to be unreachable. Check usage (or ignore if invoked
   indirectly).
 * SC2318 – This assignment is used again in this `declare`, but won't have
   taken effect. Use two `declare`s.
 * SC2319 – This `$?` refers to a condition, not a command. Assign to a variable
   to avoid it being overwritten.
 * SC2320 – This `$?` refers to echo/printf, not a previous command. Assign to
   variable to avoid it being overwritten.
 * SC2321 – Array indices are already arithmetic contexts. Prefer removing the
   `$((` and `))`.
 * SC2322 – In arithmetic contexts, `((x))` is the same as `(x)`. Prefer only
   one layer of parentheses.
 * SC2323 – `a[(x)]` is the same as `a[x]`. Prefer not wrapping in additional
   parentheses.
 * SC2324 – var+=1 will append, not increment. Use (( var += 1 )), declare -i
   var, or quote number to silence.
 * SC2325 – Multiple ! in front of pipelines are a bash/ksh extension. Use only
   0 or 1.
 * SC2326 – ! is not allowed in the middle of pipelines. Use command group as in
   `cmd | { ! cmd; }` if necessary.
 * SC3001 – In POSIX sh, process substitution is undefined.
 * SC3002 – In POSIX sh, extglob is undefined.
 * SC3003 – In POSIX sh, `$'..'` is undefined.
 * SC3004 – In POSIX sh, $".." is undefined
 * SC3005 – In POSIX sh, arithmetic for loops are undefined.
 * SC3006 – In POSIX sh, standalone `((..))` is undefined.
 * SC3007 – In POSIX sh, `$[..]` in place of `$((..))` is undefined.
 * SC3008 – In POSIX sh, select loops are undefined.
 * SC3009 – In POSIX `sh`, brace expansion is undefined.
 * SC3010 – In POSIX sh, `[[ ]]` is undefined.
 * SC3011 – In POSIX sh, here-strings are undefined.
 * SC3012 – In POSIX sh, lexicographical `\<` is undefined.
 * SC3013 – In POSIX sh, `-nt` is undefined.
 * SC3014 – In POSIX sh, `==` in place of `=` is undefined.
 * SC3015 – In POSIX sh, `=~` regex matching is undefined.
 * SC3016 – In POSIX sh, unary `-v` (in place of `[ -n "${var+x}" ]`) is
   undefined.
 * SC3017 – In POSIX sh, unary `-a` in place of `-e` is undefined.
 * SC3018 – In POSIX sh, `++` is undefined.
 * SC3019 – In POSIX sh, exponentials are undefined.
 * SC3020 – In POSIX sh, `&>` is undefined.
 * SC3021 – In POSIX sh, `>& filename` (as opposed to `>& fd`) is undefined.
 * SC3022 – In POSIX sh, named file descriptors is undefined.
 * SC3023 – In POSIX sh, FDs outside of 0-9 are undefined.
 * SC3024 – In POSIX sh, `+=` is undefined.
 * SC3025 – In POSIX sh, `/dev/{tcp,udp}` is undefined.
 * SC3026 – In POSIX sh, `^` in place of `!` in glob bracket expressions is
   undefined.
 * SC3028 – In POSIX sh, VARIABLE is undefined.
 * SC3029 – In POSIX sh, `|&` in place of `2>&1 |` is undefined.
 * SC3030 – In POSIX sh, arrays are undefined.
 * SC3031 – In POSIX sh, redirecting from/to globs is undefined.
 * SC3032 – In POSIX sh, coproc is undefined.
 * SC3033 – In POSIX sh, naming functions outside [a-zA-Z_][a-zA-Z0-9_]* is
   undefined.
 * SC3034 – In POSIX sh, `$(
 * SC3035 – In POSIX sh, `` `
 * SC3036 – In Dash, echo flags besides -n are not supported.
 * SC3037 – In POSIX sh, echo flags are undefined.
 * SC3038 – In POSIX sh, exec flags are undefined.
 * SC3039 – In POSIX sh, `let` is undefined.
 * SC3040 – In POSIX sh, set option *[name]* is undefined.
 * SC3041 – In POSIX sh, set flag `-E` is undefined
 * SC3042 – In POSIX sh, set flag `--default` is undefined
 * SC3043 – In POSIX sh, `local` is undefined.
 * SC3044 – In POSIX sh, `declare` is undefined.
 * SC3045 – In POSIX sh, some-command-with-flag is undefined.
 * SC3046 – In POSIX sh, `source` in place of `.` is undefined.
 * SC3047 – In POSIX sh, trapping ERR is undefined.
 * SC3048 – In POSIX sh, prefixing signal names with 'SIG' is undefined.
 * SC3049 – In POSIX sh, using lower/mixed case for signal names is undefined.
 * SC3050 – In POSIX sh, `printf %q` is undefined.
 * SC3051 – In POSIX sh, `source` in place of `.` is undefined
 * SC3052 – In POSIX sh, arithmetic base conversion is undefined
 * SC3053 – In POSIX sh, indirect expansion is undefined.
 * SC3054 – In POSIX sh, array references are undefined.
 * SC3055 – In POSIX sh, array key expansion is undefined.
 * SC3056 – In POSIX sh, name matching prefixes are undefined.
 * SC3057 – In POSIX sh, string indexing is undefined.
 * SC3059 –
 * SC3060 – In POSIX sh, string replacement is undefined.
 * SCXXXX –
 * Template – (Message goes here, use `code` and *foo* wisely)
 * TravisCI –
 * severity – Severity