Updated Sc2086 (markdown)

Mingye Wang
2015-11-03 08:57:46 -05:00
parent 5b784d0667
commit df511650d1

@@ -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:
```sh
$HOME/$dir/dist/bin/$file # Unquoted (bad)
"$HOME"/"$dir"/dist/bin/"$file" # Minimal quoting (good)
"$HOME/$dir/dist/bin/$file" # Canonical quoting (good)
$HOME/$dir/dist/bin/$file # Unquoted (bad)
"$HOME"/"$dir"/dist/bin/"$file" # Minimal 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.
@@ -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:
```sh
echo "This $variable is quoted $(but this $variable is not)"
echo "This $variable is quoted $(and now this "$variable" is too)"
```sh
echo "This $variable is quoted $(but this $variable is not)"
echo "This $variable is quoted $(and now this "$variable" is too)"
```
### Exceptions
Sometimes you want to split on spaces, like when building a command line.
```sh
options="-j 5 -B"
make $options file
options="-j 5 -B"
make $options file
```
Just quoting this doesn't work. Instead, you should have used an array (bash, ksh, zsh):
```bash
options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
make "${options[@]}" file
options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
make "${options[@]}" file
```
or a function (POSIX):
```sh
make_with_flags() { make -j 5 -B "$@"; }
make_with_flags file
make_with_flags() { make -j 5 -B "$@"; }
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=''`.