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
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 deecho '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
etlong
) àecho
quiecho
sorties séparées par un espace (et suivies dune nouvelle ligne), tandis que dansecho 'Too long'
, nous passons unToo long
argument à quil affiche suivi dune nouvelle ligne. Donc, il est ' fonctionnellement équivalent.
/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.dash
' s${#string}
vous donnerait la longueur en nombre doctets au lieu de caractères.