From f83e8272fe3ded60d86dd1662cf1beb74f3cd608 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Fri, 6 May 2022 10:16:01 -0700 Subject: [PATCH] Created SC2316 (markdown) --- SC2316.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 SC2316.md diff --git a/SC2316.md b/SC2316.md new file mode 100644 index 0000000..e047150 --- /dev/null +++ b/SC2316.md @@ -0,0 +1,42 @@ +## This applies local to the variable named readonly, which is probably not what you want. Use a separate command or the appropriate `declare` options instead. + + +### Problematic code: + +```sh +local readonly foo=3 +readonly export bar=4 +``` + +### Correct code: + +```sh +local foo=3 +readonly foo + +readonly bar=4 +export bar +``` + +or + +``` +declare -r foo=3 +declare -rx bar=4 +``` + +### Rationale: + +In most languages, declaration modifiers like `public`/`static`/`const` are keywords and you can apply multiple to any declaration. + +In shell scripting they are instead command names, and anything after them is an argument. This means that `readonly local foo` will create two readonly variables: `local`, and `foo`. Neither will be local. + +Instead, either use multiple commands, or use a single `declare` command with appropriate flags (`declare` will automatically make a variable local when invoked in a function, unless `-g` is passed to explicitly make it global). + +### Exceptions: + +If you want to name your variable `local`, you can quote it as in `readonly "local"` to make your intention clear to ShellCheck and other humans. + +### Related resources: + +* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc! \ No newline at end of file