Verificar la longitud de una variable

Tengo que verificar la longitud de la variable leída (mi script limita a cinco caracteres insertados), pienso en algo como esto:

#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi 

¿hay una solución más «elegante»?

Comentarios

  • Su secuencia de comandos funciona correctamente en POSIX /bin/sh estándar. Debería considerar cambiar la línea shebang a #!/bin/sh para que sea más portátil y ejecutar en entornos donde bash no está ' t disponible. Además, /bin/sh podría ser un shell más ligero como el guión que no es ' t cargado con funciones diseñadas para uso interactivo.
  • @Celada, cierto aunque en este caso, dash ' s ${#string} le daría la longitud en bytes en lugar de caracteres.

Respuesta

M ore elegante? No

¿Más corto? Sí 🙂

#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi 

Y si no tienes ningún problema en intercambiar más elegancia a favor de ser más corto, puedes tener un script con 2 líneas menos:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Puede utilizar corchetes dobles si cree que es más seguro. Explicación aquí .

Respuesta

Un Bourne compatible alternativa (${#string} es POSIX pero no Bourne (no es que probablemente te encuentres con un shell Bourne en estos días)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Tenga en cuenta que para ${#string} y ????, dependerá de si será el número de bytes o de caracteres el shell. Generalmente (y es requerido por POSIX), es el número de caracteres. Pero para algunos shells como dash que no son compatibles con múltiples bytes, serán bytes en su lugar.

Con mksh, necesita set -o utf8-mode (en configuraciones regionales UTF-8) para que comprenda los caracteres de varios bytes:

$ string=€€€ bash -c "echo "${#string}"" 3 $ string=€€€ dash -c "echo "${#string}"" 9 $ string=€€€ mksh -c "echo "${#string}"" 9 $ string=€€€ mksh -o utf8-mode -c "echo "${#string}"" 3 $ locale charmap UTF-8 

Comentarios

  • fuera del tema, pero es echo Too long diferente bajo el capó de echo 'Too long'
  • Y, si sólo imprime cuando ' es " demasiado largo ", puedo compactar aún más en mi if opción 🙂
  • @StevenPenny, echo Too long pasa dos argumentos (Too y long) a echo que echo salidas separadas por un espacio (y seguidas por una nueva línea), mientras que en echo 'Too long', pasamos una Too long argumento para que muestra seguido de una nueva línea. Entonces es ' s funcionalmente equivalente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *