Skip to content
Vidar Holen edited this page Aug 17, 2021 · 2 revisions

${$x} is invalid. For expansion, use ${x}. For indirection, use arrays, ${!x} or (for sh) eval.

(or ${${x}} is invalid)

Problematic code:

# Expecting $RETRIES or 3 if unset
retries=${$RETRIES:-3}

or

mypath="/tmp/foo.txt"
var=mypath
result=${$var##*/}  # Expecting ${mypath##*/}, i.e. 'foo.txt'

Correct code:

retries=${RETRIES:-3}

or

mypath="/tmp/foo.txt"
var=mypath
result=${!var}
result=${result##*/}

Rationale:

ShellCheck found a parameter expansion ${..} where the first element was a second parameter expansion, either ${$x..} or ${${x}..}. This is not valid.

In the first example, the extra $ was unintentional and should simply be deleted.

In the second example, ${$var##*/} was used in the hopes that it would expand to ${myvar##*/} and subsequently strip the path. This is not possible, and var must instead be expanded indirectly in a separate step, before the path can be stripped as usual. More information and other approaches can be found in the description of 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