Introducción
Bienvenido a la tercera parte de la "Guía para principiantes al BASH". Si se ha perdido los dos artículos anteriores, probablemente querrá saber qué hace que esta guía sea diferente a otras guías de scripts BASH.
Esta guía está siendo escrita por un principiante completo en BASH y así, como lector, aprendes a medida que aprendo. Aunque soy un novato en BASH, provengo de un entorno de desarrollo de software, aunque la mayoría de las cosas que he escrito han sido para la plataforma Windows.
Puedes ver las dos primeras guías visitando:
- Guía para principiantes de BASH - Hello World
- Guía para principiantes de BASH - Parámetros de entrada
Si es nuevo en BASH scripting, le recomiendo que lea las dos primeras guías antes de continuar con esta.
En esta guía, resaltaré cómo usar sentencias condicionales para probar la entrada del usuario y para controlar cómo funciona un script.
Instalar rsstail
Para seguir esta guía, deberá instalar una aplicación de línea de comandos llamada rsstail que se utiliza para leer fuentes RSS.
Si está utilizando una distribución basada en Debian / Ubuntu / Mint, escriba lo siguiente:
sudo apt-get install rsstail
Para Fedora / CentOS, etc. escriba lo siguiente:
yum instalar rsstail
Para openSUSE escriba lo siguiente:
zypper instalar rsstail
La declaración IF
Abra un terminal y cree un archivo llamado rssget.sh escribiendo lo siguiente:
sudo nano rssget.sh
Dentro del editor nano ingrese el siguiente texto:
#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Guarde el archivo presionando CTRL y O y luego salga presionando CTRL y X.
Ejecute el script escribiendo lo siguiente:
sh rssget.sh
El script devolverá una lista de títulos de la fuente RSS de linux.about.com.
No es un script demasiado útil porque solo recupera los títulos de una fuente RSS pero evita tener que recordar la ruta a la fuente RSS Linux.about.com.
Abra de nuevo el script rssget.sh en nano y edite el archivo para que tenga el siguiente aspecto:
#! / bin / bash
si $ 1 = "verboso"entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Ejecute el script nuevamente escribiendo lo siguiente:
sh rssget.sh verbose
Esta vez el feed RSS vuelve con el título, el enlace y la descripción.
Analicemos el script en detalle:
El #! / Bin / bash aparece en cada script que escribimos. La siguiente línea básicamente mira el primer parámetro de entrada provisto por el usuario y lo compara con la palabra "detallado". Si el parámetro de entrada y la palabra "verbosa" coinciden con las líneas entre entonces y fi se corren
El script anterior es obviamente defectuoso. ¿Qué sucede si no proporciona un parámetro de entrada? La respuesta es que obtiene un error en la línea de un operador inesperado.
La otra falla importante es que si no proporciona la palabra "verbosa", entonces no sucede nada. Idealmente, si no proporciona la palabra detallada, la secuencia de comandos devolverá una lista de títulos.
Use nano nuevamente para editar el archivo rssget.sh y enmiende el código de la siguiente manera:
#! / bin / bash
si $ 1 = "verboso"entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;más rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Guarde el archivo y ejecútelo escribiendo lo siguiente:
sh rssget.sh verbose
Aparecerá una lista de títulos, descripciones y enlaces. Ahora ejecútalo de la siguiente manera:
títulos de sh rssget.sh
Esta vez solo aparece una lista de títulos.
La parte extra del guión está en la línea 4 e introduce la más declaración. Básicamente, la secuencia de comandos ahora dice que si el primer parámetro es la palabra "detallada", obtenga la descripción, los enlaces y los títulos de la fuente RSS, pero si el primer parámetro es algo más, obtenga una lista de títulos.
El script ha mejorado un poco, pero sigue siendo defectuoso. Si no ingresa un parámetro, seguirá recibiendo un error. Incluso si proporciona un parámetro, solo diciendo que no quiere verbos no significa que solo quiere títulos. Es posible que haya escrito mal del todo, por ejemplo, o que haya escrito palomas, lo que por supuesto no tiene sentido.
Antes de intentar solucionar estos problemas, quiero mostrarle un comando más que acompaña a la instrucción IF.
Edite su script rssget.sh para que se vea como sigue:
#! / bin / bash
si $ 1 = "todos"entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "descripción"entonces rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Decidí deshacerme de la palabra verbosa y la reemplacé con todas. Esa no es la parte importante. El guión anterior introduce elif que es una forma corta de decir ELSE IF.
Ahora el guión funciona de la siguiente manera. Si tu corres sh rssget.sh todo A continuación, obtendrá descripciones, enlaces y títulos. Si por el contrario solo corres sh rssget.sh descripciónsólo obtendrá títulos y descripciones. Si proporciona cualquier otra palabra obtendrá una lista de títulos.
Esto introduce una forma de generar rápidamente una lista de declaraciones condicionales. Una forma alternativa de hacer ELIF es usar lo que se conoce como declaraciones IF anidadas.
El siguiente es un ejemplo que muestra cómo funcionan las declaraciones IF anidadas:
#! / bin / bash
si $ 2 = "aboutdotcom"entonces si $ 1 = "todos" entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descripción" entonces rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fimás si $ 1 = "todos" entonces rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descripción" entonces rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Siéntase libre de escribir todo eso si lo desea o cópielo y péguelo en su archivo rssget.sh.
La secuencia de comandos anterior introduce un segundo parámetro que le permite elegir "about.com" o "lxer.com" y una fuente RSS.
Para ejecutarlo escribes lo siguiente:
sh rssget.sh todo aboutdotcom
o
sh rssget.sh todo lxer
Por supuesto, puede reemplazar todo con descripciones o títulos para proporcionar solo descripciones o títulos.
Básicamente, el código anterior dice que si el segundo parámetro es aboutdotcom, mire la segunda sentencia if que es la misma que la del script anterior, si el segundo parámetro es lxer, mire la sentencia if interna nuevamente para decidir si mostrar títulos o descripciones. o todo
Esa secuencia de comandos se proporciona únicamente como un ejemplo de una declaración IF anidada y hay tantas cosas incorrectas en esa secuencia de comandos que se necesitaría otro artículo para explicarlas todas. El principal problema es que no es escalable.
¿Imagina que desea agregar otra fuente RSS como Everyday Linux User o Linux Today? La secuencia de comandos se volvería enorme y, si decidiera que deseaba que la declaración interna de IF cambiara, tendría que cambiarla en varios lugares.
Si bien hay un tiempo y un lugar para un SI anidado, deben usarse con moderación. Por lo general, hay una forma de refactorizar su código para que no necesite el SI anidado en absoluto. Iré a este tema en un futuro artículo.
Veamos ahora cómo solucionar el problema de las personas que ingresan parámetros duff. Por ejemplo, en la secuencia de comandos anterior, si el usuario ingresa algo diferente a "aboutdotcom" como el segundo parámetro, aparecerá una lista de artículos del canal RSS de LXER, independientemente de si el usuario ingresa lxer o no.
Además, si el usuario no ingresa "todos" o "descripción" como primer parámetro, entonces el valor predeterminado es una lista de títulos que puede o no ser la intención del usuario.
Mire la siguiente secuencia de comandos (o cópiela y péguela en su archivo rssget.sh).
#! / bin / bash
si $ 2 = "aboutdotcom" || $ 2 = "lxer"entonces si $ 1 = "todos" || $ 1 = "descripción" || $ 1 = "título" entonces si $ 2 = "aboutdotcom" entonces si $ 1 = "todos" entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descripción" entonces rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi más si $ 1 = "todos" entonces rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descripción" entonces rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Lo primero que se debe tener en cuenta es que el script ahora se está volviendo bastante grande y se puede ver rápidamente cómo las declaraciones IF anidadas están fuera de control.
El bit que es importante en este script es la instrucción IF || declaración ENTONCES sección en línea 2 y línea 4.
El || significa OR. Así que la líneasi $ 2 = "aboutdotcom" || $ 2 = "lxer"comprueba si el segundo parámetro es igual a "aboutdotcom" o "lxer". Si no es así, la instrucción IF está completa porque no hay más declaración para los más externos SI.
Del mismo modo en la línea 4 la línea si $ 1 = "todos" || $ 1 = "descripción" || $ 1 = "título"comprueba si el primer parámetro es igual a "todos" o "descripción" o "título".
Ahora si el usuario ejecutash rssget.sh patatas quesono se devuelve nada mientras que antes habrían recibido una lista de títulos de LXER.
Lo contrario de || es &&. El operador de && significa AND.
Voy a hacer que la secuencia de comandos se vea aún más como una pesadilla, pero hace el chequeo más importante para asegurarse de que el usuario haya proporcionado 2 parámetros.
#! / bin / bash
si $ # -eq 2entonces
si $ 2 = "aboutdotcom" || $ 2 = "lxer" entonces si $ 1 = "todos" || $ 1 = "descripción" || $ 1 = "título" entonces si $ 2 = "aboutdotcom" entonces si $ 1 = "todos" entonces rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descripción" entonces rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi más si $ 1 = "todos" entonces rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descripción" entonces rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
El único bit que es adicional en esa secuencia de comandos es otra declaración IF externa de la siguiente manera:si $ # -eq 2. Si lee el artículo sobre los parámetros de entrada, sabrá que $ # devuelve un conteo de la cantidad de parámetros de entrada. El -eq significa iguales. Por lo tanto, la instrucción IF verifica que el usuario ingresó 2 parámetros y si no lo hizo, simplemente sale sin hacer nada. (No es particularmente amigable).
Soy consciente de que este tutorial es bastante grande. No hay mucho más que cubrir esta semana, pero quiero ayudar a ordenar el guión antes de que terminemos.
El último comando que necesita para aprender sobre sentencias condicionales es la sentencia CASE.
#! / bin / bash
si $ # -eq 2entonces caja $ 2 en aboutdotcom) caja de $ 1 en todos) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; descripción) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; título) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) caja de $ 1 en todos) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; descripción) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; título) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
La declaración del caso es una forma mejor de escribir SI MÁS SI SI O TRAS SI, SI. Por ejemplo esta lógica SI fruta = plátanosLuego estoELSE IF fruit = naranjasLuego estoELSE IF fruit = uvasLuego estoTERMINARA SI Se puede reescribir como caja de fruta en plátanos hacer esto ;; naranjas) hacer esto ;; uvas) hacer esto ;;esac Básicamente, el primer artículo después del caso es lo que se va a comparar (es decir, fruta). Luego, cada elemento antes de los corchetes es la cosa con la que se está comparando y si coincide con las líneas anteriores; será corrido. Una declaración de caso se termina con el esac inverso (que es el caso al revés). En el script rssget.sh, la declaración del caso elimina parte de ese horrible anidamiento, aunque en realidad no lo mejora lo suficiente. Para mejorar realmente el script necesito presentarte las variables. Mira el siguiente código: #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" si $ # -lt 2 || $ # -gt 2entonces echo "uso: rssget.sh todas | descripción | título aboutdotcom | lxer"; salida;fi caja de $ 1 en todos) display = "- d -l -u" ;; descripción) display = "- d -u" ;; título) display = "- u" ;;esac caja $ 2 en aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url; Una variable se define dándole un nombre y luego asignándole un valor. En el ejemplo anterior, las siguientes son asignaciones de variables: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" El script es instantáneamente más manejable usando variables. Por ejemplo, cada parámetro se maneja por separado y, por lo tanto, no hay declaraciones IF anidadas. La variable de visualización ahora se establece dependiendo de si eligió todo, descripción o título y la variable url se establece en el valor de la variable aboutdotcom o el valor de la variable lxer dependiendo de si eligió aboutdotcom o lxer. El comando rsstail ahora solo tiene que usar el valor de display y url para ejecutarse correctamente. Mientras que las variables se configuran simplemente dándoles un nombre, para usarlas realmente tiene que colocar un signo $ delante de ellas. En otras palabras, variable = valor establece la variable en un valor, mientras que $ variable significa que me proporcione el contenido de la variable. El siguiente es el script final para este tutorial. #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"use = "use: rssget.sh todas | descripción | título lxer | aboutdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" si $ # -lt 2 || $ # -gt 2entonces echo $ uso; salida;fi caja de $ 1 en todos) display = "- d -l -u" ;; descripción) display = "- d -u" ;; título) display = "- u" ;; *) echo $ uso; salida; ;;esac caja $ 2 en aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; todos los usuarios url = $ everydaylinuxuser; ;; *) echo $ uso; salida;esac rsstail $ display $ url; El script anterior introduce más canales RSS y hay una variable de uso que le dice al usuario cómo usar el script si no ingresan 2 variables o si ingresan opciones incorrectas para las variables. Este ha sido un artículo épico y puede haber ido demasiado lejos demasiado pronto. En la siguiente guía, le mostraré todas las opciones de comparación para las declaraciones de IF y todavía hay mucho más de qué hablar con respecto a las variables. También se puede hacer más para mejorar el script anterior y esto se tratará en futuras guías a medida que exploremos loops, grep y expresiones regulares. Consulte la sección Cómo (Desplácese hacia abajo para ver una lista de artículos) en linux.about.com para encontrar guías más útiles desde el arranque dual de Windows y Ubuntu hasta la configuración de una máquina virtual utilizando los cuadros de GNOME. Resumen