1 SC2299
Vidar Holen edited this page 2021-08-16 21:51:43 -07:00

Parameter expansions can't be nested. Use temporary variables.

Problematic code:

path="/path/to/MyFile.mp3"
echo "Playing ${${path##*/}%.*}"    # Expect: Playing MyFile

Correct code:

path="/path/to/MyFile.mp3"
tmp=${path##*/}
echo "Playing ${tmp%.*}"

Rationale:

ShellCheck found what appears to be a nested parameter expansion. In the example, it was hoping to combine ${var##*/} to strip the directory and ${var%.*} to strip the extension.

Parameter expansions can't be nested. Use temporary variables instead, so that each parameter expansion only does a single operation.

Alternatively, if the goal is to dynamically generate and expand a variable name, see SC2082.

Exceptions:

None

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