Skip to content
Vidar Holen edited this page Nov 3, 2022 · 1 revision

Escape glob characters in arguments to expr to avoid pathname expansion.

Problematic code:

f=$(expr "$c" * 9 / 5 + 32)

Correct code:

Prefer rewriting to a modern style (see SC2003):

f=$((c * 9 / 5 + 32))

If you do not wish to do so, at least escape the glob characters when passing them to expr:

f=$(expr "$c" \* 9 / 5 + 32)

Rationale:

expr is a command so expr 2 * 2 will consider * to mean "all files in the current directory". This causes the expression to fail to evaluate unless you are in an empty directory with the failglob and nullglob options turned off.

Prefer rewriting it using the modern, POSIX standard arithmetic expansion $((..)). If you do not wish to do so, you can escape any characters like * to avoid the shell performing pathname expansion on them.

Exceptions:

None

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

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