
Quiero comprobar si una cadena que se ha escrito en una variable en bash mediante el comando de lectura es una tupla de dos números. Que yo sepa, esto debería ser posible con
if [[ "$input" =~ "$regex" ]]; then ...
para una tupla de dos números, separados por al menos un espacio en blanco y cualquier número de espacios en blanco antes y después, probé
$regex="^ *[0-9]+ +[0-9]+ *$"
que debe coincidir
12 123
23 3246543
123 345
34 23
1 234
pero no
123 123 123
1235124
123w123 123
etc.
sin embargo, esto no funciona...
Respuesta1
POSIXfunción de script de shell, utiliza la expansión de parámetros para obtener el primer y segundo número, -eq
tiene éxito solo si hay dos argumentos que son ambos el mismo número (y falla si hay menos o más argumentos, o si alguno contiene letras) y !=
para verificar si hay un espacio . Devolucionesverdaderosólo si es una tupla de dos números:
is_tup() { [ ${1% *} -eq ${1% *} -a \
${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }
Prueba:
echo '12 123
23 3246543
123 345
34 23
1 234
123 123 123
1235124
123w123 123' |
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done
Producción:
yes 12 123
yes 23 3246543
yes 123 345
yes 34 23
yes 1 234
no 123 123 123
no 1235124
no 123w123 123