Lunghezza della stringa in bash

Come si ottiene la lunghezza di una stringa memorizzata in una variabile e assegnata a un’altra variabile?

myvar="some string" echo ${#myvar} # 11 

Come si imposta un’altra variabile sull’uscita 11 ?

Lunghezza della stringa UTF-8

Oltre alla risposta corretta di fedorqui , vorrei mostrare la differenza tra lunghezza della stringa e lunghezza del byte:

 myvar='Généralités' chrlen=${#myvar} oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#myvar} LANG=$oLang LC_ALL=$oLcAll printf "%s is %d char len, but %d bytes len.\n" "${myvar}" $chrlen $bytlen 

renderà:

 Généralités is 11 char len, but 14 bytes len. 

potresti anche dare un’occhiata ai caratteri memorizzati:

 myvar='Généralités' chrlen=${#myvar} oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#myvar} printf -v myreal "%q" "$myvar" LANG=$oLang LC_ALL=$oLcAll printf "%s has %d chars, %d bytes: (%s).\n" "${myvar}" $chrlen $bytlen "$myreal" 

risponderà:

 Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s'). 

Nota: in base al commento di Isabell Cowan , ho aggiunto l’impostazione a $LC_ALL insieme a $LANG .

Lunghezza di un argomento

L’argomento funziona come le variabili regolari

 strLen() { local bytlen sreal oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#1} printf -v sreal %q "$1" LANG=$oLang LC_ALL=$oLcAll printf "String '%s' is %d bytes, but %d chars len: %s.\n" "$1" $bytlen ${#1} "$sreal" } 

funzionerà come

 strLen théorème String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me' 

Utile strumento di correzione printf :

Se tu:

 for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do printf " - %-14s is %2d char length\n" "'$string'" ${#string} done - 'Généralités' is 11 char length - 'Language' is 8 char length - 'Théorème' is 8 char length - 'Février' is 7 char length - 'Left: ←' is 7 char length - 'Yin Yang ☯' is 10 char length 

Non proprio carino … Per questo, c’è una piccola funzione:

 strU8DiffLen () { local bytlen oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#1} LANG=$oLang LC_ALL=$oLcAll return $(( bytlen - ${#1} )) } 

Quindi ora:

 for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do strU8DiffLen "$string" printf " - %-$((14+$?))s is %2d chars length, but use %2d bytes\n" \ "'$string'" ${#string} $((${#string}+$?)) done - 'Généralités' is 11 chars length, but use 14 bytes - 'Language' is 8 chars length, but use 8 bytes - 'Théorème' is 8 chars length, but use 10 bytes - 'Février' is 7 chars length, but use 8 bytes - 'Left: ←' is 7 chars length, but use 9 bytes - 'Yin Yang ☯' is 10 chars length, but use 12 bytes 

Per ottenere la lunghezza di una stringa memorizzata in una variabile, dì:

 myvar="some string" size=${#myvar} 

Per confermare che è stato salvato correttamente, echo :

 $ echo "$size" 11 

Puoi usare:

 MYSTRING="abc123" MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c) 
  • wc -c o wc --bytes byte per il conteggio dei byte = i caratteri Unicode vengono conteggiati con 2, 3 o più byte.
  • wc -m o wc --chars per il conteggio dei caratteri = I caratteri Unicode vengono contati singolarmente fino a quando non usano più byte.

Se vuoi usarlo con gli argomenti della riga di comando o della funzione, assicurati di utilizzare size=${#1} invece di size=${#$1} . Il secondo potrebbe essere più istintivo ma syntax errata.

Ecco un paio di modi per calcolare la lunghezza della variabile:

 echo ${#VAR} echo -n $VAR | wc -m echo -n $VAR | wc -c printf $VAR | wc -m expr length $VAR expr $VAR : '.*' 

e per impostare il risultato in un’altra variabile, basta assegnare il comando precedente con back quote in un’altra variabile come segue:

 otherVar=`echo -n $VAR | wc -m` echo $otherVar 

http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html

In risposta al post che inizia:

Se vuoi usarlo con gli argomenti della riga di comando o della funzione …

con il codice:

 size=${#1} 

Potrebbe esserci il caso in cui si desidera verificare un argomento a lunghezza zero e non è necessario memorizzare una variabile. Credo che tu possa usare questo tipo di syntax:

 if [ -z "$1" ]; then #zero length argument else #non-zero length fi 

Vedi GNU e wooledge per un elenco più completo di espressioni condizionali di Bash.

Stavo cercando di fare qualcosa di simile, ma volevo solo assicurarmi che l’input dell’utente non fosse troppo lungo.

 if [ ${#string} -ge 12 ]; then echo ">= 12 characters. too long" exit else echo "under 12 characters, not too long." fi 

Volevo il caso più semplice, finalmente questo è un risultato:

 echo -n 'Tell me the length of this sentence.' | wc -m; 36 

Vorrei usare qualcosa del genere:

 var2=$(echo $myvar | wc -c) 

Non hai bisogno di una sceneggiatura.