mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Updated Sc2086 (markdown)
26
Sc2086.md
26
Sc2086.md
@@ -25,9 +25,9 @@ Quoting variables prevents word splitting and glob expansion, and prevents the s
|
|||||||
Strictly speaking, only expansions themselves need to be quoted, but for stylistic reasons, entire arguments with multiple variable and literal parts are often quoted as one:
|
Strictly speaking, only expansions themselves need to be quoted, but for stylistic reasons, entire arguments with multiple variable and literal parts are often quoted as one:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$HOME/$dir/dist/bin/$file # Unquoted (bad)
|
$HOME/$dir/dist/bin/$file # Unquoted (bad)
|
||||||
"$HOME"/"$dir"/dist/bin/"$file" # Minimal quoting (good)
|
"$HOME"/"$dir"/dist/bin/"$file" # Minimal quoting (good)
|
||||||
"$HOME/$dir/dist/bin/$file" # Canonical quoting (good)
|
"$HOME/$dir/dist/bin/$file" # Canonical quoting (good)
|
||||||
```
|
```
|
||||||
|
|
||||||
When quoting composite arguments, make sure to exclude globs and brace expansions, which lose their special meaning in double quotes: `"$HOME/$dir/src/*.c"` will not expand, but `"$HOME/$dir/src"/*.c` will.
|
When quoting composite arguments, make sure to exclude globs and brace expansions, which lose their special meaning in double quotes: `"$HOME/$dir/src/*.c"` will not expand, but `"$HOME/$dir/src"/*.c` will.
|
||||||
@@ -35,31 +35,31 @@ When quoting composite arguments, make sure to exclude globs and brace expansion
|
|||||||
Note that `$( )` starts a new context, and variables in it have to be quoted independently:
|
Note that `$( )` starts a new context, and variables in it have to be quoted independently:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
echo "This $variable is quoted $(but this $variable is not)"
|
echo "This $variable is quoted $(but this $variable is not)"
|
||||||
echo "This $variable is quoted $(and now this "$variable" is too)"
|
echo "This $variable is quoted $(and now this "$variable" is too)"
|
||||||
```sh
|
```
|
||||||
|
|
||||||
### Exceptions
|
### Exceptions
|
||||||
Sometimes you want to split on spaces, like when building a command line.
|
Sometimes you want to split on spaces, like when building a command line.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
options="-j 5 -B"
|
options="-j 5 -B"
|
||||||
make $options file
|
make $options file
|
||||||
```
|
```
|
||||||
|
|
||||||
Just quoting this doesn't work. Instead, you should have used an array (bash, ksh, zsh):
|
Just quoting this doesn't work. Instead, you should have used an array (bash, ksh, zsh):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
|
options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
|
||||||
make "${options[@]}" file
|
make "${options[@]}" file
|
||||||
```
|
```
|
||||||
|
|
||||||
or a function (POSIX):
|
or a function (POSIX):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make_with_flags() { make -j 5 -B "$@"; }
|
make_with_flags() { make -j 5 -B "$@"; }
|
||||||
make_with_flags file
|
make_with_flags file
|
||||||
```
|
```
|
||||||
|
|
||||||
To split on spaces but not perform glob expansion, Posix has a `set -f` to disable globbing. You can disable word splitting by setting IFS="".
|
To split on spaces but not perform glob expansion, Posix has a `set -f` to disable globbing. You can disable word splitting by setting `IFS=''`.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user