Verify the length of a variable
More elegant? No
Shorter? Yes :)
#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
And if you have no problem on trading more elegance in favor of being shorter, you can have a script with 2 lines less:
#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"
You could use double brackets if you think it is safer. Explanation here.
A Bourne-compatible alternative (${#string}
is POSIX but not Bourne (not that you're likely to ever come across a Bourne shell these days)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Note that for both ${#string}
and ????
, whether it will be the number of bytes or characters will depend on the shell. Generally (and it's required by POSIX), it is the number of characters. But for some shells like dash
that are not multi-byte aware, it will be bytes instead.
With mksh
, you need set -o utf8-mode
(in UTF-8 locales) for it to understand multi-byte characters:
$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8