diff --git a/SC2306.md b/SC2306.md new file mode 100644 index 0000000..20c8cdf --- /dev/null +++ b/SC2306.md @@ -0,0 +1,35 @@ +## Escape glob characters in arguments to expr to avoid pathname expansion. + +### Problematic code: + +```sh +f=$(expr "$c" * 9 / 5 + 32) +``` + +### Correct code: + +Prefer rewriting to a modern style (see [[SC2003]]): + +```sh +f=$((c * 9 / 5 + 32)) +``` + +If you do not wish to do so, at least escape the glob characters when passing them to `expr`: + +```sh +f=$(expr "$c" \* 9 / 5 + 32) +``` + +### Rationale: + +`expr` is a command so `expr 2 * 2` will consider `*` to mean "all files in the current directory". This causes the expression to fail to evaluate unless you are in an empty directory with the `failglob` and `nullglob` options turned off. + +Prefer rewriting it using the modern, POSIX standard arithmetic expansion `$((..))`. If you do not wish to do so, you can escape any characters like `*` to avoid the shell performing pathname expansion on them. + +### Exceptions: + +None + +### Related resources: + +* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc! \ No newline at end of file