${$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!
-
Installation
-
Usage
-
Integrating and extending
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.