Estoy tratando de hacer algo lo suficientemente común: analizar la entrada del usuario en un script de shell. Si el usuario proporcionó un número entero válido, el script hace una cosa, y si no es válido, hace otra. El problema es que no he encontrado una manera fácil (y razonablemente elegante) de hacer esto; no quiero tener que separarlo char por char.
Sé que esto debe ser fácil, pero no sé cómo. Podría hacerlo en una docena de idiomas, ¡pero no en BASH!
En mi investigación encontré esto:
Expresión regular para probar si una cadena consta de un número real válido en base 10
Y hay una respuesta allí que habla de expresiones regulares, pero que yo sepa, esa es una función disponible en C (entre otras). Aún así, tenía lo que parecía una gran respuesta, así que lo probé con grep, pero grep no sabía qué hacer con él. Probé -P que en mi caja significa tratarlo como una expresión regular PERL - nada. Dash E (-E) tampoco funcionó. Y tampoco -F.
Para que quede claro, estoy intentando algo como esto, buscando cualquier resultado; a partir de ahí, piratearé el script para aprovechar lo que obtenga. (IOW, esperaba que una entrada no conforme no devolviera nada mientras se repite una línea válida).
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
¿Alguien podría ilustrar cómo se hace esto más fácilmente?
Francamente, esto es un defecto de TEST, en mi opinión. Debería tener una bandera como esta
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
es viejo compatibletest
;[[
es lo nuevo de Bash, con más operaciones y diferentes reglas de cotización. Si ya ha decidido seguir con Bash, hágalo[[
(es mucho mejor); si necesita portabilidad a otras conchas, evítelo por[[
completo.