titulo - Longitud de la cuerda en bash
title seo length (10)
¿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 configura otra variable para la salida 11
?
Longitud de la cadena UTF-8
Además de la respuesta correcta de fedorqui , me gustaría mostrar la diferencia entre la longitud de la cadena y la longitud 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
renderizará:
Généralités is 11 char len, but 14 bytes len.
Incluso podrías 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
.
Duración 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"
}
trabajará 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
Aquí hay algunas formas 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 inicio del post:
Si desea utilizar esto con la línea de comandos o argumentos de función ...
con el código:
size=${#1}
Puede darse el caso de que solo desee verificar un argumento de longitud cero y no tenga necesidad de almacenar una variable. Creo que puedes usar este tipo de sintaxis:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
Consulte GNU y wooledge para obtener una lista más completa de 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
Para obtener la longitud de una cadena almacenada en una variable, diga:
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
owc --bytes
bytes para conteos de bytes = Los caracteres Unicode se cuentan con 2, 3 o más bytes. -
wc -m
owc --chars
para conteos de caracteres = Los caracteres Unicode se cuentan solos hasta que usan más bytes.
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 desea usar esto con la línea de comandos o los argumentos de la función, asegúrese de usar size=${#1}
lugar de size=${#$1}
. El segundo puede ser más instintivo pero la sintaxis es incorrecta.
Usando su ejemplo proporcionado
#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
Yo usaría algo como esto:
var2=$(echo $myvar | wc -c)
No necesitas un guión.