Created SC1014 (markdown)

koalaman
2016-10-01 14:18:46 -07:00
parent baf4eab8cc
commit 490baffcaa

43
SC1014.md Normal file

@@ -0,0 +1,43 @@
## Use 'if cmd; then ..' to check exit code, or 'if [\[ $(cmd) == .. ]]' to check output.
### Problematic code:
```sh
if [ grep -q pattern file ]
then
echo "Found a match"
fi
```
### Correct code:
```sh
if grep -q pattern file
then
echo "Found a match"
fi
```
### Rationale:
`[ .. ]` is not part of shell syntax like `if` statements. It is not equivalent to parentheses in C-like languages, `if (foo) { bar; }`, and should not be wrapped around commands to test.
`[` is just regular command, like `whoami` or `grep`, but with a funny name (see `ls -l /bin/[`). It's a shorthand for `test`.
If you want to check the exit status of a certain command, use that command directly as demonstrated in the correct code.
If you want to check the output of a command, use `"$(..)"` to get its output, and then use `test` or `[`/`[[` to do a string comparison:
```
# Check output of `whoami` against the string `root`
if [ "$(whoami)" = "root" ]
then
echo "Running as root"
fi
```
For more information, see [this problem in the Bash Pitfall](http://mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D) list, or generally [Test and Conditionals](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals) in the WoolEdge BashGuide
### Exceptions:
None.