Skip to content
Vidar Holen edited this page Aug 17, 2021 · 1 revision

Parameter expansion can't be applied to command substitutions. Use temporary variables.

Problematic code:

echo "Building ${$(git rev-parse --show-toplevel)##*/}"

Correct code:

tmp=$(git rev-parse --show-toplevel)
echo "Building ${tmp##*/}"

Rationale:

ShellCheck found a parameter expansion that begins with a command substitution, such as $(..) or `..`. This is not valid. Parameter expansion only works on variables (normal or special).

In the example, the user hoped to apply the construct ${var##*/}, stripping the path, to the current git root directory as output by git rev-parse --show-toplevel. Since parameter expansion only works on variable, the command substitution must be assigned to a variable first like in the correct example.

If the goal was instead to dynamically generate a variable name to expand, see SC2082.

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