From 11f61173020179c6e1a27c8d00f60b28ebae94e7 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Mon, 16 Aug 2021 21:47:00 -0700 Subject: [PATCH] Created SC2298 (markdown) --- SC2298.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 SC2298.md diff --git a/SC2298.md b/SC2298.md new file mode 100644 index 0000000..6bcc15e --- /dev/null +++ b/SC2298.md @@ -0,0 +1,50 @@ +## `${$x}` is invalid. For expansion, use ${x}. For indirection, use arrays, ${!x} or (for sh) eval. + +(or `${${x}}` is invalid) + +### Problematic code: + +```sh +# Expecting $RETRIES or 3 if unset +retries=${$RETRIES:-3} +``` + +or + +```sh +mypath="/tmp/foo.txt" +var=mypath +result=${$var##*/} # Expecting ${mypath##*/}, i.e. 'foo.txt' +``` + +### Correct code: + +```sh +retries=${RETRIES:-3} +``` + +or + +```sh +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. + +### Exceptions: + +None + +### Related resources: + +* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc! \ No newline at end of file