Deseamos regalarte la mejor respuesta que encontramos por todo internet. Nuestro deseo es que te sea de mucha ayuda y si puedes compartir cualquier detalle que nos pueda ayudar a perfeccionar nuestra información hazlo con total libertad.
Solución:
Para obtener la longitud de un string almacenado en una variable, digamos:
myvar="some string"
size=$#myvar
Para confirmar que se guardó correctamente, echo
eso:
$ echo "$size"
11
UTF-8 string longitud
Además de la respuesta correcta de fedorqui, me gustaría mostrar la diferencia entre string longitud y longitud de bytes:
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: ($'G303251n303251ralit303251s').
No un: De acuerdo con el comentario de Isabell Cowan, he agregado la configuración a $LC_ALL
junto con $LANG
.
Longitud de un argumento
El 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: $'th303251or303250me'
Útil printf
herramienta de corrección:
Si usted:
for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do
printf " - %-14s is %2d char lengthn" "'$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
Realmente no bonita… 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 uses %2d bytesn"
"'$string'" $#string $(($#string+$?))
done
- 'Généralités' is 11 chars length, but uses 14 bytes
- 'Language' is 8 chars length, but uses 8 bytes
- 'Théorème' is 8 chars length, but uses 10 bytes
- 'Février' is 7 chars length, but uses 8 bytes
- 'Left: ←' is 7 chars length, but uses 9 bytes
- 'Yin Yang ☯' is 10 chars length, but uses 12 bytes
Desafortunadamente, ¡esto no es perfecto!
Pero quedó un comportamiento extraño de UTF-8, como caracteres a doble espacio, caracteres con espacio cero, desplazamiento inverso y otros que no podrían ser tan simples…
Eche un vistazo a diffU8test.sh o diffU8test.sh.txt para conocer más limitaciones.
Quería el caso más simple, finalmente este es un resultado:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
Si piensas que ha resultado útil nuestro artículo, agradeceríamos que lo compartas con otros seniors de este modo nos ayudas a difundir esta información.