Vérifier la longueur d'une variable

27

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

Pol Hallen
la source
1
Votre script fonctionne correctement dans POSIX standard /bin/sh. Vous devriez envisager de changer la ligne shebang pour #!/bin/shqu'elle soit plus portable et s'exécute dans des environnements où bash n'est pas disponible. De plus, /bin/shpeut être un shell plus léger comme un tableau de bord qui n'est pas surchargé de fonctionnalités destinées à une utilisation interactive.
Celada
@Celada, vrai que dans ce cas, dashest ${#string}-vous donner la longueur en nombre d'octets au lieu de caractères.
Stéphane Chazelas

Réponses:

43

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 .


la source
3

Une alternative compatible avec Bourne ( ${#string}est POSIX mais pas Bourne (pas que vous rencontrerez probablement un shell Bourne 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 dashcelui-ci qui ne sont pas multi-octets, ce seront des octets à la place.

Avec mksh, vous avez besoin 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
Stéphane Chazelas
la source
hors sujet, mais est echo Too longdifférent sous le capot deecho 'Too long'
Steven Penny
Et, si vous imprimez juste quand c'est "trop ​​long", je peux compacter encore plus sur mon ifoption :)
2
@StevenPenny, echo Too longpasse deux arguments ( Tooet long) echoauxquels les echosorties sont séparées par un espace (et suivies d'un retour à la ligne), tandis que dans echo 'Too long', nous passons un Too longargument echoauquel il s'affiche suivi d'un retour à la ligne. C'est donc fonctionnellement équivalent.
Stéphane Chazelas