¿Cómo se obtiene la longitud de una cadena almacenada en una variable y se la asigna a otra variable?
myvar="some string"
echo ${#myvar}
# 11
¿Cómo se configura otra variable para la salida 11
?
¿Cómo se obtiene la longitud de una cadena almacenada en una variable y se la asigna a otra variable?
myvar="some string"
echo ${#myvar}
# 11
¿Cómo se configura otra variable para la salida 11
?
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
rendirá:
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: Según el comentario de Isabell Cowan , agregué configuración $LC_ALL
junto con $LANG
.
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: $'th\303\251or\303\250me'
printf
herramienta de corrección: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 uses %2d bytes\n" \
"'$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
Pero dejó un comportamiento extraño de UTF-8, como caracteres de doble espacio, caracteres de cero espacio, desplazamiento inverso y otros que no podrían ser tan simples ...
Eche un vistazo a diffU8test.sh o diffU8test.sh.txt para obtener más limitaciones.
Para obtener la longitud de una cadena almacenada en una variable, diga:
Para confirmar que se guardó correctamente,
echo
se:fuente
$rulename
$RULE_PREFIX
[ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
y{#myvar}
?${#parameter}
: La longitud en caracteres del valor ampliado de parámetro está sustituido .Puedes usar:
wc -c
owc --bytes
para recuentos de bytes = los caracteres Unicode se cuentan con 2, 3 o más bytes.wc -m
owc --chars
para recuentos de caracteres = los caracteres Unicode se cuentan solo hasta que usan más bytes.fuente
mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
mientras que la solución aceptada falla y usted necesitamyvar=$HOME/.ssh
primero.Quería el caso más simple, finalmente este es un resultado:
fuente
echo '' | wc -m
=>1
. Necesitarías usar-n
:echo -n '' | wc -m
=>0
... en cuyo caso es una buena solución :)-n do not output the trailing newline
Si desea usar esto con argumentos de línea de comando o función, asegúrese de usarlo en
size=${#1}
lugar desize=${#$1}
. El segundo puede ser más instintivo pero es una sintaxis incorrecta.fuente
size=${#1}
Ciertamente es válido.#
no reemplaza el$
- el$
exterior de las llaves sigue siendo el operador de expansión. El#
es el operador de longitud, como siempre.En respuesta al inicio de la publicación:
con el código:
Puede haber un caso en el 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:
Consulte GNU y wooledge para obtener una lista más completa de expresiones condicionales de Bash.
fuente
Usando su ejemplo proporcionado
fuente
Aquí hay un par de formas de calcular la longitud de la variable:
y para establecer el resultado en otra variable simplemente asigne el comando anterior con comillas inversas en otra variable de la siguiente manera:
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html
fuente