Longitud de la cadena en bash

¿Cómo se obtiene la longitud de una cadena almacenada en una variable y se asigna a otra variable?

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

¿Cómo se establece otra variable para la salida 11 ?

Longitud de cuerda UTF-8

Además de la respuesta correcta de Fedorqui , me gustaría mostrar la diferencia entre la longitud de la cuerda y el 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 

rendirá:

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

incluso podría echar un vistazo a los caracteres almacenados:

 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" 

Responderé:

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

Nota: De acuerdo con el comentario de Isabell Cowan , he agregado la configuración a $LC_ALL junto con $LANG .

Longitud de un argumento

Argumento funciona igual que las variables regulares

 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" } 

funcionará como

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

Herramienta de corrección de printf útil:

Si 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 

No es realmente bonito … Para esto, hay una pequeña función:

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

Entonces ahora:

 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 

Para obtener la longitud de una cadena almacenada en una variable, digamos:

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

Para confirmar que se guardó correctamente, echo :

 $ echo "$size" 11 

Puedes usar:

 MYSTRING="abc123" MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c) 
  • wc -c o wc --bytes bytes para recuentos de bytes = los caracteres Unicode se cuentan con 2, 3 o más bytes.
  • wc -m o wc --chars para recuentos de caracteres = los caracteres Unicode se cuentan solos hasta que usan más bytes.

Si desea usar esto con línea de comando o argumentos de función, asegúrese de usar size=${#1} lugar de size=${#$1} . El segundo puede ser más instintivo pero es una syntax incorrecta.

Aquí hay algunas maneras de calcular la longitud de la variable:

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

y para establecer el resultado en otra variable, simplemente asigne el comando anterior con comillas en otra variable de la siguiente manera:

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

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

En respuesta al post inicio:

Si desea usar esto con línea de comando o argumentos de función …

con el código:

 size=${#1} 

Puede haber casos en los que solo desee verificar un argumento de longitud cero y no tenga que almacenar una variable. Creo que puedes usar este tipo de syntax:

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

Consulte GNU y wooledge para obtener una lista más completa de las expresiones condicionales de Bash.

Estaba tratando de hacer algo similar, pero solo quería asegurarme de que la entrada del usuario no fuera demasiado larga.

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

Quería el caso más simple, finalmente este es un resultado:

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

Yo usaría algo como esto:

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

No necesitas un script