Verifica la lunghezza di una variabile


27

Devo verificare la lunghezza della variabile letta (il mio script ha un limite di cinque caratteri inseriti), penso a qualcosa del genere:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

esiste una soluzione più "elegante"?


1
Lo script funziona correttamente in POSIX standard /bin/sh. Dovresti considerare di cambiare la linea shebang in #!/bin/shmodo che sia più portatile e funzionante in ambienti in cui bash non è disponibile. Inoltre, /bin/shpotrebbe essere una shell più leggera come il trattino che non è gravata da funzionalità pensate per l'uso interattivo.
Celada,

@Celada, vero se in questo caso, dash's ${#string}darebbe la lunghezza in numero di byte invece di caratteri.
Stéphane Chazelas,

Risposte:


43

Più elegante? No

Più breve? Sì :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

E se non hai problemi a scambiare più eleganza a favore dell'essere più breve, puoi avere uno script con 2 righe in meno:

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

Puoi usare le doppie parentesi se pensi che sia più sicuro. Spiegazione qui .


3

Un'alternativa compatibile con Bourne ( ${#string}è POSIX ma non Bourne (non che in questi giorni ti imbatterai probabilmente in una shell Bourne)):

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

Si noti che per entrambi ${#string}e ????, se sarà il numero di byte o caratteri dipenderà dalla shell. Generalmente (ed è richiesto da POSIX), è il numero di caratteri. Ma per alcune shell del genere dashnon sono a conoscenza del multi-byte, saranno invece byte.

Con mksh, è necessario set -o utf8-mode(nelle versioni locali UTF-8) per comprendere i caratteri multi-byte:

$ 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

fuori tema, ma è echo Too longdiverso sotto il cofano diecho 'Too long'
Steven Penny

E, se stamperai solo quando è "troppo lungo", posso compattare ancora di più sulla mia ifopzione :)

2
@StevenPenny, echo Too longpassa due argomenti ( Tooe long) a echocui gli echooutput sono separati da uno spazio (e seguiti da una nuova riga), mentre in echo 'Too long', passiamo un Too longargomento a echocui viene visualizzato seguito da una nuova riga. Quindi è funzionalmente equivalente.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.