Skip to content
wileyhy edited this page Oct 6, 2024 · 9 revisions

Use if cmd; then .. to check exit code, or if [ "$(cmd)" = .. ] to check output.

Problematic code:

if [ grep -q pattern file ]
then
  echo "Found a match"
fi

Correct code:

if grep -q pattern file
then
  echo "Found a match"
fi

Rationale:

[ ... ] as shell syntax is a simple command that tests for whether certain conditions are true or false, such as whether the value assigned to a variable has a non-zero length ([ -n "${foo}" ]) or whether a file system object is a directory ([ -d "${dir}" ]). If-then-(elif-then)-else-fi statements are logical constructs which themselves contain lists of commands which can include simple commands.

[ is just regular command, like whoami or grep, but with a funny name (see ls -l /bin/[). It's a shorthand for test. [[ is similar to both [ and test, but [[ offers some additional unary operators, such as '=~' the regular expression comparison operator. It allows one to use extglobs such as @(foo|bar) (a "bashism"), among some other less commonly used features.

[[, [ and test are often used within if...fi constructs in the conditional commands position: which is between the 'if' and the 'then.'

There are certain shell syntaxes which can be wrapped directly around simple commands, in particular: (1) { ...;} compound command groupings, (2) $( ... ) command substitutions and (3) <( ... ) and >( ... ) process substitutions. Some examples include { [ -d "${HOME}/file" ]; echo $?;}, var=$(logname) and readarray -d "" -t files < <( find ~ -iname '*bash*' -print0 2> /dev/null ), respectively. However, the various testing commands' syntaxes are not to be included among this list.

If you want to check the exit status of a certain command, use that command directly as demonstrated in the correct code, above.

If you want to check the output of a command, use "$(..)" to get its output, and then use test or [/[[ to do a string comparison:

# Check output of `whoami` against the string `root`
if [ "$(whoami)" = "root" ]
then
  echo "Running as root"
fi

For more information, see this problem in the Bash Pitfall list, or generally Tests and Conditionals in the WoolEdge BashGuide

Exceptions:

None.

Related resources:

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally