Verify the length of a variable

I’ve to verify the length of variable read (my script limit to five the characters inserted), I think about something like this:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

is there a more “elegant” solution?

Asked By: Pol Hallen

||

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.

Answered By: user34720

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
Answered By: Stéphane Chazelas
Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.