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

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

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