Skip to content
Vidar Holen edited this page May 6, 2022 · 1 revision

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:

local readonly foo=3
readonly export bar=4

Correct code:

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!

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