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
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 daecho '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
elong
) aecho
cheecho
output separati da uno spazio (e seguiti da una nuova riga), mentre inecho 'Too long'
ne passiamo unoToo long
argomento di che viene visualizzato seguito da una nuova riga. Quindi è ' equivalente funzionale.
/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.dash
' s${#string}
ti darebbe la lunghezza in numero di byte invece che in caratteri.