Je dois vérifier la longueur de la variable lue (ma limite de script à cinq caractères insérés), je pense à quelque chose comme ceci:
#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
existe-t-il une solution plus "élégante"?
Plus élégant? Non
Plus court? Oui :)
#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
Et si vous n'avez aucun problème à échanger plus d'élégance en faveur d'être plus court, vous pouvez avoir un script avec 2 lignes de moins:
#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"
Vous pouvez utiliser des crochets doubles si vous pensez que c'est plus sûr. Explication ici .
Une alternative compatible avec Bourne (${#string}
est POSIX mais pas Bourne (pas que vous rencontrerez probablement un Bourne Shell de nos jours)):
case $string in
?????*) echo >&2 Too long; exit 1;;
*) echo OK
esac
Notez que pour les deux ${#string}
et ????
, que ce soit le nombre d'octets ou de caractères dépendra du Shell. Généralement (et c'est requis par POSIX), c'est le nombre de caractères. Mais pour certains shells comme dash
qui ne sont pas multi-octets, ce seront des octets à la place.
Avec mksh
, vous avez besoin de set -o utf8-mode
(dans les locales UTF-8) pour qu'il comprenne les caractères multi-octets:
$ 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