mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Updated SC2082 (markdown)
27
SC2082.md
27
SC2082.md
@@ -8,16 +8,39 @@
|
|||||||
|
|
||||||
### Correct code:
|
### Correct code:
|
||||||
|
|
||||||
|
Bash/ksh:
|
||||||
|
|
||||||
|
# Use arrays instead of dynamic names
|
||||||
|
declare -a var
|
||||||
|
var[1]="hello world"
|
||||||
|
n=1
|
||||||
|
echo "${var[n]}"
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
# Expand variable names dynamically
|
||||||
var_1="hello world"
|
var_1="hello world"
|
||||||
n=1
|
n=1
|
||||||
name="var_$n"
|
name="var_$n"
|
||||||
echo "${!name}"
|
echo "${!name}"
|
||||||
|
|
||||||
|
POSIX sh:
|
||||||
|
|
||||||
|
# Expand dynamically with eval
|
||||||
|
var_1="hello world"
|
||||||
|
n=1
|
||||||
|
eval "tmp=\$var_$n"
|
||||||
|
echo "${tmp}"
|
||||||
|
|
||||||
### Rationale:
|
### Rationale:
|
||||||
|
|
||||||
You can expand a variable `var_1` with `${var_1}`, but you can not generate the string `var_1` with an embedded expansion, like `${var_$n}`. Instead, you have to use an indirect reference.
|
You can expand a variable `var_1` with `${var_1}`, but you can not generate the string `var_1` with an embedded expansion, like `${var_$n}`.
|
||||||
|
|
||||||
You do this by creating a variable containing the variable name you want, e.g. `myvar="var_$n"` and then expanding it indirectly with `${!myvar}`. This will give the contents of the variable `var_1`.
|
Instead, if at all possible, you should use an array. Bash and ksh support both numerical and associative arrays, and an example is shown above.
|
||||||
|
|
||||||
|
If you can't use arrays, you can indirectly reference variables by creating a temporary variable with its name, e.g. `myvar="var_$n"` and then expanding it indirectly with `${!myvar}`. This will give the contents of the variable `var_1`.
|
||||||
|
|
||||||
|
If using POSIX sh, where neither arrays nor `${!var}` is available, `eval` can be used. You must be careful in sanitizing the data used to construct the variable name to avoid arbitrary code execution.
|
||||||
|
|
||||||
### Exceptions:
|
### Exceptions:
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user