SC3012
Vidar Holen edited this page Apr 1, 2021
·
3 revisions
In POSIX sh, lexicographical \< is undefined.
Problematic code:
#!/bin/sh
x="aardvark"
y="zebra"
if [ $x \< $y ]
then
echo "$x comes before $y in the dictionary"
fiCorrect code:
First, make sure you wanted a lexicographical comparison (aka dictionary order), and not a numerical comparison.
Then to compare as string, you can use expr and make sure that the strings are not interpreted numerically by adding some non-numerical data to them. Here, an apostrophe is prepended:
#!/bin/sh
x="aardvark"
y="zebra"
if expr "'$x" \< "'$y" > /dev/null
then
echo "$x comes before $y in the dictionary"
fi
Rationale:
The test binary operators >, \>, <, and \< are not part of POSIX and not guaranteed to be supported in scripts targeting sh.
The expr functionality is specified by POSIX.
Exceptions:
If you know your sh will be e.g. dash, consider explicitly using #!/bin/dash.