Linux en Espanol
 
Comodines en bash (tema #24716)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-04-30 13:33:46    Asunto: Comodines en bash

Buenas estoy haciendo un script que te identifica tus ips y para el rango 172.16.x.x 172.31.x.x
ten?a esto


[code:1:9b800c6965]
#!/bin/bash
echo "escribe ip"
read ip
if [[ "$ip" =~ 172.* ]];
then
echo "es una ip b"
else
echo "no es una ip b"
fi[/code:1:9b800c6965]

Nota: con las [[ y =~ el programa acepta comodines.



Despues de 172. yo pensaba ponerle el comod?n "[16-31]" pero este parece que s?lo funciona con numeros del 0 al 9 no da para por ejemplo "del 12 al 15" s?lo para "del 1 al 8" etc...

De momento todas las ips que empiezan por 172 las toma como ip de tipo B s?lo me falta que coja de 172.16.* a 172.31.*


notal*El programa que quiero hacer es mas complejo que solo saber que tipo de ip escribes pero necesita saberlo para funcionar

Espero haberme expresado lo mejor posible gracias de antemano chicos

8)
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-04-30 22:02:50    Asunto:

Hola.

Se puede hacer con expresiones regulares aunque sale un poco lioso, al menos para mi gusto.
Sser?a algo parecido a esto:

[code:1:db7e35bec3]#!/bin/bash
echo "Escribe la IP: "
read IP
echo "La IP a verificar es: $IP"
if [ -z $(echo $IP | grep -o -E "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b") ];then
echo "No pasa la validaci?n laxa"
else
echo "S? pasa la validaci?n laxa"
fi

if [ -z $(echo $IP | grep -o -E "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b") ];then
echo "No pasa la validaci?n estricta"
else
echo "S? pasa la validaci?n estricta"
fi
[/code:1:db7e35bec3]
Si te fijas, la verificaci?n est? hecha dos veces. La primera s?lo verifica que la IP sea NNN.NNN.NNN.NNN, admitiendo que los n?meros menores que 100 se pongan con menos de tres cifras o con ceros a la izquierda. Pero no valida que los n?meros de tres cifras no sean superiores a 255, por lo que se tragar?a por ejemplo 888.888.555.666. Si esta validaci?n es aceptable para ti, la expresi?n regular es relativamente simple.
La segunda verificaci?n, que ya usa una expresi?n regular de tama?o excesivo, valida adem?s que los n?meros no excedan a 255. A?n se le escapan algunos detalles, como que aceptar?a 0.0.0.0, 255.255.255.255 Para validar esos casos extremos de 0 en el primer n?mero y 255 en el ?ltimo habr?a que complicar a?n m?s la expresi?n regular. Yo creo que no merece la pena, pero el que debe decidirlo eres t?.
La informaci?n la he tomado de [url]http://www.vicente-navarro.com/blog/2007/04/13/expresiones-regulares-en-la-shell-ejemplos-de-uso-con-grep-awk-y-sed/[/url] Pongo la referencia por agradecimiento, no por publicidad.

Saludos.
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-04-30 22:12:59    Asunto:

Hola, de nuevo.

De todos modos lo tienes resuelto en un foro estupendo llamado [b:ef0958301b][color=red:ef0958301b]linuxespanol.com[/color:ef0958301b][/b:ef0958301b] :
[url]http://www.linuxespanol.com/viewtopic.php?t=23817&sid=302d4e0e8d1c7d8256ec9c7113cf52b7[/url] :wink:

Saludos.
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-05-03 09:38:00    Asunto:

Pues muchas gracias para lo de las ips 172 tambi?n se me ha ocurrido esto

[code:1:e5eae38233]#!/bin/bash
read ipr
if [[ "$ipr" =~ 172.1[6-9].* || "$ipr" =~ 172.2[0-9].* || "$ipr" =~ 172.31.* ]];
then
echo "es una ip 172"
exit
else
echo "NO es una ip 172"
exit
fi[/code:1:e5eae38233]

Y lo de saber si son xxx.xxx.xxx.xxx tamb?en me viene muy bien la verdad
gracias

Buscar? algo para que tengan que ser menores de 255
cazademonios
Forista
Registrado: 2012-03-23
Mensajes: 68

Publicado: 2013-05-03 14:37:44    Asunto:

para que vea que sean xxx.xxx.xxx.xxx y que ademas no sean mayores de 255 se podr?a hacer con esto

[code:1:9c15c64aec]#!/bin/bash
echo "escribe tu ip"
read ip
c1=$(echo "$ip" | cut -d "." -f "1")
c2=$(echo "$ip" | cut -d "." -f "2")
c3=$(echo "$ip" | cut -d "." -f "3")
c4=$(echo "$ip" | cut -d "." -f "4")
c5=$(echo "$ip" | cut -d "." -f "4")
if [ "$c1" -gt 255 -o "$c2" -gt 255 -o "$c3" -gt 255 -o "$c4" -gt 255 -o -n "$c5"] 2>&- ;
then
echo "no es una ip"
else
if [ -z $(echo $ip | grep -o -E "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b") ];
then
echo "esto no es una ip"
else
echo "si es una ip"
fi
fi[/code:1:9c15c64aec]

S?lo un fallo que en caso de escribir texto el bash te manda un error que dice que no se esperaba una expresion entera (es decir num?rica) PERO lo acabo de corregir capando la salida de errores del primer condicional con "2>&-"
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2013-05-04 14:09:56    Asunto:

Hola.

Creo que ser?a m?s sencillo si en vez de comprobar que no supera 255 y despu?s comprobar el formato nnn.nnn.etc, comprobaras primero el formato nnn.nnn.... y luego lo del 255.
Con este cambio, para la comprobaci?n de 255 ya estar?as totalmete seguro de que son n?meros ya que han pasado la comprobaci?n anterior.
De todos modos, en el enlace que te pas? un poco m?s arriba:[url]http://www.linuxespanol.com/viewtopic.php?t=23817&sid=302d4e0e8d1c7d8256ec9c7113cf52b7[/url], hay a su vez un post de un tal miguegf :roll: :roll: :roll: :roll: que te redirige a este post: [url]http://www.linuxjournal.com/content/validating-ip-address-bash-script[/url], donde hay un m?todo de la misma inspiraci?n que el tuyo, pero un poco m?s corto.
Aunque sea s?lo por curiosidad, ?chale un vistazo.

Saludos.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries