Tengo que verificar la longitud de la lectura variable (mi script limita a cinco los 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"?
/bin/sh
. Debería considerar cambiar la línea shebang a#!/bin/sh
para que sea más portátil y se ejecute en entornos donde bash no esté disponible. Además,/bin/sh
podría ser un shell más liviano como el tablero que no está cargado con características destinadas para uso interactivo.dash
's${#string}
le daría la longitud en número de bytes en lugar de caracteres.Respuestas:
¿Mas elegante? No
¿Corto? Sí :)
Y si no tiene problemas para negociar más elegancia a favor de ser más corto, puede tener un script con 2 líneas menos:
Podrías usar corchetes dobles si crees que es más seguro. Explicación aquí .
fuente
Una alternativa compatible con Bourne (
${#string}
es POSIX pero no Bourne (no es probable que encuentre un shell Bourne en estos días)):Tenga en cuenta que para ambos
${#string}
y????
, si será el número de bytes o caracteres dependerá del shell. Generalmente (y es requerido por POSIX), es el número de caracteres. Pero para algunos shells comodash
ese no son compatibles con varios bytes, en su lugar serán bytes.Con
mksh
, necesitaset -o utf8-mode
(en configuraciones regionales UTF-8) para que comprenda los caracteres de varios bytes:fuente
echo Too long
diferente bajo el capó deecho 'Too long'
if
opción :)echo Too long
pasa dos argumentos (Too
ylong
) a losecho
que lasecho
salidas están separadas por un espacio (y seguidas por una nueva línea), mientras que enecho 'Too long'
, pasamos unToo long
argumento alecho
que se muestra seguido por una nueva línea. Entonces es funcionalmente equivalente.