Vérifiez la longueur dune variable

Je « dois vérifier la longueur de la variable lue (mon script limite à 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 

y a-t-il une solution plus « élégante »?

Commentaires

  • Votre script fonctionne correctement dans POSIX standard /bin/sh. Vous devriez envisager de changer la ligne shebang en #!/bin/sh afin quelle soit plus portable et sexécuter dans des environnements où bash nest pas ' t disponible. De plus, /bin/sh pourrait être un shell plus léger comme dash qui nest pas ' t surchargé de fonctionnalités destinées à une utilisation interactive.
  • @Celada, mais dans ce cas, dash ' s ${#string} vous donnerait la longueur en nombre doctets au lieu de caractères.

Réponse

M ou é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 navez aucun problème à trader plus délégance au profit dêtre plus court, vous pouvez avoir un script avec 2 lignes en moins:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Vous pouvez utiliser des doubles crochets si vous pensez que cest plus sûr. Explication ici .

Réponse

A Bourne-compatible alternative (${#string} est POSIX mais pas Bourne (pas que vous soyez susceptible de rencontrer un shell Bourne ces jours-ci)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Notez que pour ${#string} et ????, le nombre doctets ou de caractères dépendra de le shell. Généralement (et cest requis par POSIX), cest le nombre de caractères. Mais pour certains shells comme dash qui ne prennent pas en charge le multi-octet, ce sera plutôt des octets.

Avec mksh, vous avez besoin de set -o utf8-mode (dans les paramètres régionaux UTF-8) pour comprendre 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 

Commentaires

  • hors sujet, mais echo Too long différent sous le capot de echo 'Too long'
  • Et, si vous voulez simplement imprimer quand ' s " trop long ", je peux compacter encore plus sur mon option if 🙂
  • @StevenPenny, echo Too long transmet deux arguments (Too et long) à echo qui echo sorties séparées par un espace (et suivies dune nouvelle ligne), tandis que dans echo 'Too long', nous passons un Too long argument à quil affiche suivi dune nouvelle ligne. Donc, il est ' fonctionnellement équivalent.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *