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
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ó deecho '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
ylong
) aecho
queecho
salidas separadas por un espacio (y seguidas por una nueva línea), mientras que enecho 'Too long'
, pasamos unaToo long
argumento para que muestra seguido de una nueva línea. Entonces es ' s funcionalmente equivalente.
/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.dash
' s${#string}
le daría la longitud en bytes en lugar de caracteres.