web-dev-qa-db-fra.com

Vérifier la longueur d'une variable

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"?

31
Pol Hallen

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 .

48
user34720

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
3
Stéphane Chazelas