mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 11:19:45 +08:00
Created SC2124 (markdown)
37
SC2124.md
Normal file
37
SC2124.md
Normal file
@@ -0,0 +1,37 @@
|
||||
## Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.
|
||||
|
||||
### Problematic code:
|
||||
|
||||
var=$@
|
||||
for i in $var; do ..; done
|
||||
|
||||
or
|
||||
|
||||
set -- Hello World
|
||||
msg=$@
|
||||
echo "You said $msg"
|
||||
|
||||
### Correct code:
|
||||
|
||||
var=( "$@" )
|
||||
for i in "${var[@]}"; do ..; done
|
||||
|
||||
or
|
||||
|
||||
set -- Hello World
|
||||
msg=$*
|
||||
echo "You said $msg"
|
||||
|
||||
### Rationale:
|
||||
|
||||
Arrays and `$@` can contain multiple elements. Simple variables contain only one. When assigning multiple elements to one element, the default behavior depends on the shell (bash concatenates with spaces, zsh concatenates with first char of `IFS`).
|
||||
|
||||
Since doing this usually indicates a bug, ShellCheck warns and asks you to be explicit about what you want.
|
||||
|
||||
If you want to assign N elements as N elements, use an array, e.g. `myArray=( "$@" )`.
|
||||
|
||||
If you want to assign N elements as 1 element by concatenating them, use `*` instead of `@`, e.g. `myVar=${myArray[*]}` (this separates elements with the first character of `IFS`, usually space).
|
||||
|
||||
### Contraindications
|
||||
|
||||
None.
|
Reference in New Issue
Block a user