Solución:
Aquí está:
#!/bin/bash
if [[ $1 =~ ^[0-9]+$ ]]
then
echo "ok"
else
echo "no"
fi
Imprime ok
si el primer argumento contiene solo dígitos y no
de lo contrario. Podrías llamarlo con: ./yourFileName.sh inputValue
[[ $myvar =~ [^[:digit:]] ]] || echo All Digits
O, si te gusta el if-then
formulario:
if [[ $myvar =~ [^[:digit:]] ]]
then
echo Has some nondigits
else
echo all digits
fi
En tiempos antiguos, hubiéramos usado [0-9]
. Estos formularios no son seguros para Unicode. El reemplazo moderno seguro para Unicode es [:digit:]
.
Si desea realizar la prueba de una manera compatible con POSIX, puede usar:
expr string : regex ## returns length of string if both sides match
o
expr match string regex ## behaves the same
Por ejemplo para probar si $myvar
son todos los dígitos:
[ $(expr "x$myvar" : "x[0-9]*$") -gt 0 ] && echo "all digits"
Nota: 'x'
antepuesto a la variable y la expresión para proteger contra la prueba de error de lanzamiento de cadena vacía. Usar el length
devuelto por la prueba, no olvides restar 1
que representa el 'x'
.
En if-then-else
formulario, aquí hay un breve script que prueba si el primer argumento del script contiene todos los dígitos:
#!/bin/sh
len=$(expr "x$1" : "x[0-9]*$") ## test returns length if $1 all digits
let len=len-1 ## subtract 1 to compensate for 'x'
if [ $len -gt 0 ]; then ## test if $len -gt 0 - if so, all digits
printf "n '%s' : all digits, length: %d charsn" "$1" $len
else
printf "n '%s' : containes characters other than [0-9]n" "$1"
fi
Salida de ejemplo
$ sh testdigits.sh 265891
'265891' : all digits, length: 6 chars
$ sh testdigits.sh 265891t
'265891t' : contains characters other than [0-9]
La prueba de expresión regular de bash [[ $var =~ ^[0-9]+$ ]]
está bien, lo uso, pero es un bashismo (limitado al shell bash). Si le preocupa la portabilidad, la prueba POSIX funcionará en cualquier shell compatible con POSIX.