Necesito calcular la longitud de una cadena usando únicamente sh shell. Lo que sucede es que /bin/sh
en realidad es un enlace suave a bash u otro shell. Por lo tanto, ${#STRING}
proporciona la longitud de la cadena como característica avanzada de bash.
¿Alguien puede decirme cómo puedo encontrar la longitud de una cuerda? Estoy usando la arquitectura Solaris 5.10 Sparc.
Respuesta1
wc -m
cuenta los caracteres en una cadena. Entonces puedes hacer algo como:
STRLENGTH=$(echo -n $STRING | wc -m)
Sintaxis alternativa:
STRLENGTH=`echo -n $STRING | wc -m`
La -n
bandera de eco evita que imprima una nueva línea. La bandera puede ser diferente en Solaris 5. Verificarman echo
Respuesta2
Aquí hay un par de formas de hacerlo.
myvar="This is a test"
echo "${#myvar}"
14
O
expr length "${myvar}"
14
Respuesta3
Usando ${#string}
para obtener la longitud de $string
esuna expansión de parámetros de shell POSIX. No es una bash
característica exclusiva.
En Solaris 5.10, si /bin/sh
o /usr/bin/sh
(como se menciona en elsh(1)
manual) no admite esto, entonces /usr/xpg4/bin/sh
lo hará.
Para obtener el comportamiento POSIX en un sistema Solaris 5.10, debe PATH
configurarlo en
/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin
(en ese orden), como se describe en elstandards(5)
manual.
Respuesta4
No creo que la "pura mierda" pueda hacerlo. Pero no es necesario hacer nada en "puro sh"; debes hacerlo en sh plus con las utilidades estándar. La forma más sencilla es:
strlength=`expr "$string" : ".*"`
(expréses POSIX). O si no lo tiene expr
(Solaris 5.1 es antiguo), también puede usarWCJuntos conimprimirfcomo:
strlength=`printf "%s" "$string" | wc -m`
Simplemente no intentes usar echo
, porque echo agregará nuevas líneas al final y no existe una forma estándar de suprimirlo.
Tenga en cuenta que wc -m
cuenta caracteres y wc -c
cuenta bytes si hay una diferencia en la configuración regional actual.