Updated SC2157 (markdown)

Vidar Holen
2018-08-29 10:43:45 -07:00
parent a295815960
commit 62ab4099c2

@@ -1,11 +1,12 @@
## Argument to implicit -n is always true due to literal strings.
(Or: Argument to -z is always false due to literal strings. )
### Problematic code:
```sh
if [ "$foo " ]
then
echo "this is always true"
echo "this is always true because of the trailing space"
fi
```
@@ -20,9 +21,16 @@ fi
### Rationale:
Since `[ str ]` checks that the string is non-empty, the space inside the quotes in the problematic code causes the test to always be true, since a string with a space can not be empty.
Since `[ str ]` and `[ -n str ]` check that the string is non-empty, any literal characters in the string -- including a space character like in the example -- will cause the test to always be true.
Equivalently, since `[ -z str ]` checks that the string is empty, any literal character in the string will cause the test to always be false.
Double check the string: you may have added trailing characters, or bad quotes or syntax. Some examples include:
* `[ "$foo " ]` like in the example, where the space becomes part of the string
* `[ "{$foo}" ]` instead of `[ "${foo}" ]`, where the `{` becomes part of the string
* `[ "$foo -gt 0" ]` instead of `[ "$foo" -gt "0" ]`, where the `-gt` becomes part of the string
Sometimes this is also caused by overquoting an example, e.g. `[ "$foo -gt 0" ]`, which is always true for the same reason. The intention here was `[ "$foo" -gt 0 ]`.
### Exceptions: