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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0