Verifica la lunghezza di una variabile

Devo verificare la lunghezza della variabile letta (il mio script limita a cinque i caratteri inseriti), penso a qualcosa di simile questo:

#!/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”?

Commenti

  • Lo script funziona correttamente nello standard POSIX /bin/sh. Ti consigliamo di modificare la riga shebang in #!/bin/sh in modo che sia più portabile ed eseguito in ambienti in cui bash non è ' t disponibile. Inoltre, /bin/sh potrebbe essere una shell più leggera come dash che non è ' t gravato da funzionalità pensate per un uso interattivo.
  • @Celada, vero anche se in questo caso, dash ' s ${#string} ti darebbe la lunghezza in numero di byte invece che in caratteri.

Risposta

M o elegante? No

Più corto? 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 di essere più brevi, puoi avere uno script con 2 righe in meno:

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

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

Risposta

Compatibile con Bourne alternativa (${#string} è POSIX ma non Bourne (non che “potresti mai imbatterti in una Bourne shell in questi giorni)):

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

Nota che sia per ${#string} e ????, se sarà il numero di byte o caratteri dipenderà da la shell. In genere (ed è richiesto da POSIX), è il numero di caratteri. Ma per alcune shell come dash che non riconoscono i multibyte, saranno invece i byte.

Con mksh, è necessario set -o utf8-mode (nelle versioni locali UTF-8) affinché possa comprendere i caratteri multibyte:

$ 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 

Commenti

  • fuori tema, ma echo Too long dietro le quinte è diverso da echo 'Too long'
  • E se stampi solo quando ' è " troppo lungo ", posso compattare ancora di più con la mia if opzione 🙂
  • @StevenPenny, echo Too long passa due argomenti (Too e long) a echo che echo output separati da uno spazio (e seguiti da una nuova riga), mentre in echo 'Too long' ne passiamo uno Too long argomento di che viene visualizzato seguito da una nuova riga. Quindi è ' equivalente funzionale.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *