Created SC2205 (markdown)

koalaman
2017-01-09 23:43:28 -08:00
parent ba80e675fc
commit af16a6d949

32
SC2205.md Normal file

@@ -0,0 +1,32 @@
## (..) is a subshell. Did you mean [ .. ], a test expression?
### Problematic code:
```sh
if ( 1 -lt 2 )
then
echo "1 is less than 2"
fi
```
### Correct code:
```sh
if [ 1 -lt 2 ]
then
echo "1 is less than 2"
fi
```
### Rationale:
Tests like `-eq` to check numeric equality or `\<` for string comparison only work are actually parameters to the `test` command, and only work as tests in that context. `[` is an alias for `test`, so you'll frequently see them written as `[ 1 -eq 2 ]`.
`( .. )` is completely unrelated, and is a subshell mostly used to scope shell modifications. They should not be used in `if` or `while` statements in shell scripts.
If you wanted to test a condition, rewrite the `( .. )` to `[ .. ]`.
### Exceptions:
This error is triggered by having a binary operator as the first parameter in a subshell, and could falsely trigger on e.g. `if ( grep -eq "foo|bar" file )`. In these cases, check whether the subshell is actually needed.
Note that there's a similar looking error [[SC2204]] with a low false positive rate.