Skip to content
John Gardner edited this page Dec 22, 2021 · 7 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:

[ .. ] is not part of shell syntax like if statements. It is not equivalent to parentheses in C-like languages, if (foo) { bar; }, and should not be wrapped around commands to test.

[ is just regular command, like whoami or grep, but with a funny name (see ls -l /bin/[). It's a shorthand for test.

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

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 guerraart8 to find a specific , or see Checks.

Clone this wiki locally