Guía de inicio para BASH - Condicións e variables

Introdución

Benvido á terceira parte da "Guía de inicio para BASH". Se perdeches os dous artigos anteriores, probablemente quererá saber o que fai que esta guía sexa diferente a outras guías de script de BASH.

Esta guía está sendo escrita por un novato completo a BASH e así como un lector que aprende como aprendo. Mentres eu son un novato para BASH provén dun fondo de desenvolvemento de software aínda que a maioría das cousas que escribín foi para a plataforma Windows.

Podes ver as dúas primeiras guías visitando:

Se vostede é novo en script BASH recomendo ler as dúas primeiras guías antes de continuar con este.

Nesta guía vou destacar como usar declaracións condicionais para probar a entrada do usuario e controlar como funciona un script.

Instalar rsstail

Para seguir esta guía necesitará instalar unha aplicación de liña de comandos chamada rsstail que se usa para ler feeds RSS .

Se está a usar un tipo de distribución baseado en Debian / Ubuntu / Mint, o seguinte:

sudo apt-get install rsstail

Para Fedora / CentOS etc, escriba o seguinte:

yum install rsstail

Para openSUSE escriba o seguinte:

zypper instalar rsstail

A declaración IF

Abra un terminal e cree un ficheiro chamado rssget.sh escribindo o seguinte:

sudo nano rssget.sh

Dentro do editor nano introduza o seguinte texto:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Garda o ficheiro premendo CTRL e O e despois saia premendo CTRL e X.

Executa o script escribindo o seguinte:

sh rssget.sh

O script devolverá unha lista de títulos desde o feed RSS de linux.about.com.

Non é un script moi útil porque só recupera os títulos dun feed RSS pero non ten que lembrar a ruta para o feed RSS de Linux.about.com.

Abre nuevamente o script rssget.sh en nano e edite o ficheiro para que faga o seguinte:

#! / bin / bash

se [$ 1 = "verbose"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Executa o script de novo escribindo o seguinte:

sh rssget.sh verbose

Nesta ocasión o feed RSS volve co título, a ligazón ea descrición.

Analicemos o guión cun pouco de detalles:

O #! / Bin / bash aparece en cada script que escribimos. A liña seguinte mira basicamente o primeiro parámetro de entrada que fornece o usuario e compárao coa palabra "detallado". Se o parámetro de entrada e a palabra "verbose" coinciden coas liñas entre entón e fi .

O guión anterior é obviamente imperfecto. Que pasa se non forneces un parámetro de entrada? A resposta é que obteñas un erro ao longo das liñas do operador inesperado.

O outro defecto principal é que se non forneces a palabra "verbal", non pasa nada. Idealmente se non fornezas a palabra verbose o script devolvería unha lista de títulos.

Use o nano de novo para editar o ficheiro rssget.sh e cambiar o código do seguinte xeito:

#! / bin / bash

se [$ 1 = "verbose"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Garda o ficheiro e executa-lo escribindo o seguinte:

sh rssget.sh verbose

Aparecerá unha lista de títulos, descricións e ligazóns. Agora execútao de novo como segue:

sh rssget.sh títulos

Esta vez só aparece unha lista de títulos.

A parte adicional do script está na liña 4 e introduce a declaración else . Basicamente, o script di agora se o primeiro parámetro é a palabra "verbosa" obtén a descrición, enlaces e títulos do feed RSS pero se o primeiro parámetro é outra cousa, obtén unha lista de títulos.

O guión mellorou un pouco pero aínda está mal. Se non introduce un parámetro, aínda recibirá un erro. Mesmo se proporcionas un parámetro, simplemente dicindo que non queres verbalmente non significa que queres só títulos. Quizais acabe de escribir un erro incorrecto, por exemplo, ou pode ter pombas tipográficas que por suposto non teñen sentido.

Antes de tentar aclarar estes problemas, quero mostrarlle un comando máis que vai coa declaración IF.

Edite o seu script rssget.sh para que pareza o seguinte:

#! / bin / bash

se [$ 1 = "todos"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Decidín desfacerse da palabra verbosa e substituíla por todos. Esa non é a parte importante. O script anterior introduce o elif que é un xeito curto de dicir ELSE IF.

Agora o script funciona do seguinte xeito. Se executas sh rssget.sh todo entón obtés descricións, enlaces e títulos. Se en vez acaba de executar a descrición de sh rssget.sh , só obtén títulos e descricións. Se proporcionas algunha outra palabra recibirás unha lista de títulos.

Isto introduce unha forma de chegar rapidamente a unha lista de declaracións condicionais. Unha forma alternativa de facer ELIF é usar o que se coñece como declaracións IF aniñadas.

O seguinte é un exemplo que mostra como funcionan as instrucións IF aniñadas:

#! / bin / bash

se [$ 2 = "aboutdotcom"]
entón
se [$ 1 = "todos"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
outra cousa
se [$ 1 = "todos"]
entón
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Non dubide en escribir todo o que queiras no caso de que queiras ou copialo e pégalo no teu ficheiro rssget.sh.

O script mencionado arriba introduce un segundo parámetro que permite elixir "about.com" ou "lxer.com" un feed RSS.

Para executalo escribe o seguinte:

sh rssget.sh todo sobredotcom

ou

sh rssget.sh todos os lxer

Pode, por suposto, substituír todas as descricións ou títulos para proporcionar só descricións ou só títulos.

Basicamente o código de arriba di se o segundo parámetro é aboutdotcom entón mire a segunda instrución if que é a mesma da outra guión anterior se o segundo parámetro é lxer entón mire a declaración interna si para decidir se mostrar títulos ou descricións ou todo.

Este script proporciónase puramente como un exemplo dunha declaración IF aniñada e hai tantas cousas malas con ese script que levaría outro artigo para explicar a todos. O principal problema é que non é escalable.

Imaxina que quería engadir outro feed RSS como Everyday Linux User ou Linux Today? O script converteríase en enorme e se decidiu que quería que a declaración IF interna cambie, terías que cambialo en varios lugares.

Aínda que hai un tempo e un lugar para un IF anidado se deben empregar con moderación. Normalmente hai un xeito de refactorizar o seu código para que non necesite o IF anidado. Virei a este asunto nun artigo futuro.

Vexamos agora a resolución do problema das persoas que ingresan aos parámetros duff. Por exemplo, no script anterior, se o usuario introduce algo distinto de "aboutdotcom" como parámetro 2, a continuación, aparece unha lista dos artigos da fonte RSS de LXER independentemente de se o usuario introduce lxer ou non.

Ademais, se o usuario non introduce "todos" ou "descrición" como parámetro 1, o predeterminado é unha lista de títulos que poden ou non ser o que o usuario desexou.

Mire o seguinte script (ou copie e pégalo no seu ficheiro rssget.sh.

#! / bin / bash

se [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
entón
se [$ 1 = "all"] || [$ 1 = "descrición"] || [$ 1 = "título"]
entón
se [$ 2 = "aboutdotcom"]
entón

se [$ 1 = "todos"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
outra cousa
se [$ 1 = "todos"]
entón
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

O primeiro que hai que ter en conta é que o script agora se está facendo bastante grande e pode ver rapidamente como se poden facer as declaracións IF aniñadas sen control.

O bit que é importante neste script é a declaración IF || declaración THEN sección en liña 2 e liña 4.

A || significa OR. Entón, a liña se [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] verifica se o segundo parámetro é igual a "aboutdotcom" ou "lxer". Se non é así, a declaración IF complétase porque non hai ningunha outra declaración para a maior parte externa IF.

Do mesmo xeito na liña 4 a liña se [$ 1 = "all"] || [$ 1 = "descrición"] || [$ 1 = "title"] verifica se o primeiro parámetro é igual a "todo" ou "descrición" ou "título".

Agora si o usuario executa sh rssget.sh non se devolve nada de pataca, mentres que antes recibirían unha lista de títulos de LXER.

O contrario de || é &&. O & & operador representa AND.

Vou facer que o guión pareza aínda máis como un pesadelo, pero fai o control importante para asegurarse de que o usuario proporcionou 2 parámetros.

#! / bin / bash

se [$ # -eq 2]
entón

se [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
entón
se [$ 1 = "all"] || [$ 1 = "descrición"] || [$ 1 = "título"]
entón
se [$ 2 = "aboutdotcom"]
entón

se [$ 1 = "todos"]
entón
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
outra cousa
se [$ 1 = "todos"]
entón
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descrición"]
entón
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
outra cousa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

O único bit que é extra nese script é outra declaración IF externa do seguinte xeito: se [$ # -eq 2] . Se leu o artigo sobre os parámetros de entrada, saberá que $ $ devolve un reconto do número de parámetros de entrada. O -eq significa igual. A declaración IF, polo tanto, verifica que o usuario introduciu 2 parámetros e se non só saíron sen facer nada. (Non particularmente amigable).

Son consciente de que este tutorial está quedando bastante grande. Non hai moito máis que cubrir esta semana, pero quero axudar a ordenar o guión antes de que terminemos.

O último comando que necesitas saber sobre as declaracións condicionais é a instrución CASE.

#! / bin / bash


se [$ # -eq 2]
entón
caso $ 2 en
aboutdotcom)
caso $ 1 en
todos)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
descrició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)
caso $ 1 en
todos)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
descrición)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
título)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

A declaración do caso é un xeito máis sinxelo de escribir. Se o fose, se o fose.

Por exemplo esta lóxica

IF froita = bananas
Entón iso
ELSE SI froita = laranxas
Entón iso
ELSE SI froita = uvas
Entón iso
END IF

pode ser reescrito como:

froita case en
bananas)
facelo
;;
laranxas)
facelo
;;
uvas)
facelo
;;
esac

Basicamente o primeiro elemento despois do caso é o que vai comparar (é dicir, froita). Entón cada elemento antes dos parénteses é o que está a comparar e se corresponde coas liñas precedentes; executarase. A instrución do caso termina coa esac inversa (que é case cara atrás).

No script rssget.sh, a instrución do caso elimina parte da horrible anidación, aínda que non mellora o suficiente.

Para realmente mellorar o script necesito presentarche as variables.

Mire o seguinte código:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
amosar = ""
url = ""

se [$ # -lt 2] || [$ # -gt 2]
entón
echo "use: rssget.sh [todo | descrición] título] [aboutdotcom | lxer]";
saír;
fi

caso $ 1 en
todos)
display = "- d -l -u"
;;
descrición)
display = "- d -u"
;;
título)
display = "- u"
;;
esac

caso $ 2 en
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ mostrar $ url;

Unha variable defínese dándolle un nome e asignándolle un valor. No exemplo anterior, as seguintes son asignacións de variables:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
amosar = ""
url = ""

O script é inmediatamente máis manexable mediante o uso de variables. Por exemplo, cada parámetro é tratado por separado e polo tanto non hai declaracións IF aniñadas.

A variable de visualización agora está definida en función de se elixiu todo, a descrición ou o título ea variable url está axustada ao valor da variante aboutdotcom ou ao valor da variable lxer dependendo se escolle aboutdotcom ou lxer.

O comando rsstail agora só ten que usar o valor da pantalla e url para correr correctamente.

Mentres as variables están definidas só dándolles un nome, para usalos realmente ten que poñer un sinal de dólares diante deles. Noutras palabras, variable = valor establece variable a un valor mentres que $ variable significa darme o contido da variable.

O seguinte é o guión final deste tutorial.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
dailylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
uso = "uso: rssget.sh [todo | descrición] título] [lxer | aboutdotcom | dailylinuxuser | linuxtoday]"
amosar = ""
url = ""

se [$ # -lt 2] || [$ # -gt 2]
entón
eco $ use;
saír;
fi

caso $ 1 en
todos)
display = "- d -l -u"
;;
descrición)
display = "- d -u"
;;
título)
display = "- u"
;;
*)
eco $ use;
saír;
;;
esac

caso $ 2 en
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
dailylinuxuser)
url = $ dailylinuxuser;
;;
*)
eco $ use;
saír;
esac

rsstail $ mostrar $ url;

O script mencionado anteriormente introduce máis fontes RSS e hai unha variable de uso que lle indica ao usuario como usar o script se non ingresan dúas variables ou ingresan opcións incorrectas para as variables.

Resumo

Este foi un artigo épico e pode que teña ido demasiado pronto. Na seguinte guía mostrarémosche todas as opcións de comparación para as declaracións IF e aínda hai moito máis que falar sobre as variables.

Hai tamén máis que se pode facer para mellorar o guión anterior e este estará cuberto en futuras guías mentres exploramos loops, grep e expresións regulares.

Consulta o How to (desprácese ata as categorías para ver unha lista de artigos) da sección inux.about.com para atopar as guías máis útiles do arranque dual de Windows e Ubuntu para configurar unha máquina virtual usando caixas de GNOME .