Skip to main content

Beginners Guide To Bash - Condições e Variáveis

O Guia DEFINITIVO de UBUNTU para Devs Iniciantes (Abril 2025)

O Guia DEFINITIVO de UBUNTU para Devs Iniciantes (Abril 2025)
Anonim

Introdução

Bem-vindo à terceira parte do "Beginners Guide To BASH". Se você perdeu os dois artigos anteriores, provavelmente desejará saber o que torna esse guia diferente de outros guias de script BASH.

Este guia está sendo escrito por um novato completo para a BASH e, assim, como leitor, você aprende à medida que aprendo. Embora eu seja novato na BASH, eu venho de uma experiência em desenvolvimento de software, embora a maioria das coisas que escrevi tenha sido para a plataforma Windows.

Você pode ver os dois primeiros guias visitando:

  • Guia de iniciantes para BASH - Hello World
  • Beginners Guide To BASH - Parâmetros de entrada

Se você é novo no script BASH, recomendo ler as duas primeiras guias antes de continuar com esta.

Neste guia, irei destacar como usar instruções condicionais para testar a entrada do usuário e controlar o funcionamento de um script.

Instalar o rsstail

Para seguir este guia, você precisará instalar um aplicativo de linha de comando chamado rsstail, que é usado para ler feeds RSS.

Se você estiver usando uma distribuição baseada em Debian / Ubuntu / Mint, digite o seguinte:

sudo apt-get install rsstail

Para o Fedora / CentOS, digite o seguinte:

yum instalar rsstail

Para o openSUSE, digite o seguinte:

zypper instala o rsstail

A instrução IF

Abra um terminal e crie um arquivo chamado rssget.sh digitando o seguinte:

sudo nano rssget.sh

Dentro do editor nano, digite o seguinte texto:

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

Salve o arquivo pressionando CTRL e O e, em seguida, saia pressionando CTRL e X.

Execute o script digitando o seguinte:

sh rssget.sh

O script retornará uma lista de títulos do feed RSS linux.about.com.

Não é um script excessivamente útil porque apenas recupera os títulos de um feed RSS, mas economiza para lembrar o caminho para o feed RSS do Linux.about.com.

Abra o script rssget.sh no nano novamente e edite o arquivo da seguinte forma:

#! / bin / bash

if $ 1 = "verbose"então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi

Execute o script novamente digitando o seguinte:

sh rssget.sh verbose

Desta vez, o feed RSS volta com o título, link e descrição.

Vamos analisar o script em detalhes:

O #! / Bin / bash aparece em todos os scripts que escrevemos. A próxima linha basicamente observa o primeiro parâmetro de entrada fornecido pelo usuário e o compara à palavra "verbose". Se o parâmetro de entrada e a palavra "verbose" corresponderem às linhas entre então e fi estão correu.

O script acima é obviamente defeituoso. O que acontece se você não fornecer um parâmetro de entrada? A resposta é você obter um erro ao longo das linhas do operador inesperado.

A outra grande falha é que, se você não fornecer a palavra "verbose", nada acontece. Idealmente, se você não fornecer a palavra verbose, o script retornará uma lista de títulos.

Use o nano novamente para editar o arquivo rssget.sh e alterar o código da seguinte forma:

#! / bin / bash

if $ 1 = "verbose"então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi

Salve o arquivo e execute-o digitando o seguinte:

sh rssget.sh verbose

Uma lista de títulos, descrições e links será exibida. Agora execute-o novamente da seguinte forma:

sh rssget.sh títulos

Desta vez, apenas uma lista de títulos aparece.

A parte extra do script está na linha 4 e introduz o outro declaração. Basicamente, o script agora diz que se o primeiro parâmetro é a palavra "verbose", obtenha a descrição, links e títulos para o feed RSS, mas se o primeiro parâmetro é qualquer outra coisa, é só pegar uma lista de títulos.

O script melhorou ligeiramente, mas ainda está falho. Se você não conseguir inserir um parâmetro, ainda receberá um erro. Mesmo se você fornecer um parâmetro, apenas dizendo que você não quer verboso não significa que você quer apenas títulos. Você pode ter acabado de soletrar errado por exemplo ou pode ter digitado pombos, o que é obviamente sem sentido.

Antes de tentarmos limpar esses problemas, quero mostrar-lhe mais um comando que acompanha a instrução IF.

Edite seu script rssget.sh da seguinte forma:

#! / bin / bash

if $ 1 = "todos"então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "descrição"então rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Eu decidi me livrar da palavra verbose e substituí-la por todas. Essa não é a parte importante. O script acima apresenta elif que é um modo curto de dizer ELSE IF.

Agora o script funciona da seguinte maneira. Se você correr sh rssget.sh all então você recebe descrições, links e títulos. Se você apenas correr sh rssget.sh descriçãovocê só vai conseguir títulos e descrições. Se você fornecer qualquer outra palavra, você receberá uma lista de títulos.

Isso introduz uma maneira de criar rapidamente uma lista de instruções condicionais. Uma maneira alternativa de fazer o ELIF é usar o que é conhecido como instruções IF aninhadas.

A seguir, um exemplo mostrando como as instruções IF aninhadas funcionam:

#! / bin / bash

if $ 2 = "aboutdotcom"então if $ 1 = "todos" então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrição" então rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fioutro if $ 1 = "todos" então rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrição" então rsstail -d -u http://lxer.com/module/newswire/headlines.rss outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi

Sinta-se à vontade para digitar tudo isso, se você gosta ou copie e cole no seu arquivo rssget.sh.

O script acima introduz um segundo parâmetro que permite escolher "about.com" ou "lxer.com" e um feed RSS.

Para executá-lo, você digita o seguinte:

sh rssget.sh all aboutdotcom

ou

sh rssget.sh todos lxer

É claro que você pode substituir todos os itens por descrições ou títulos para fornecer apenas descrições ou apenas títulos.

Basicamente, o código acima diz que se o segundo parâmetro é aboutdotcom, então olhe para a segunda instrução if que é a mesma do script anterior, se o segundo parâmetro for lxer, então olhe a declaração if interna para decidir se mostra títulos, descrições ou tudo mais.

Esse script é fornecido apenas como um exemplo de uma instrução IF aninhada e há tantas coisas erradas com esse script que seria necessário um outro artigo para explicá-las todas. A questão principal é que não é escalável.

Imagine que você queria adicionar outro feed RSS, como Everyday Linux User ou Linux Today? O script se tornaria enorme e se você decidisse que queria que a instrução IF interna mudasse, teria que alterá-lo em vários lugares.

Embora haja um tempo e lugar para um IF aninhado, eles devem ser usados ​​com moderação. Geralmente, há uma maneira de refatorar seu código para que você não precise do IF aninhado. Eu vou abordar esse assunto em um artigo futuro.

Vamos agora olhar para consertar o problema das pessoas que entram em duff parameters. Por exemplo, no script acima, se o usuário inserir algo diferente de "aboutdotcom" como o segundo parâmetro, uma lista de artigos será exibida a partir do feed RSS da LXER, independentemente de o usuário inserir lxer ou não.

Além disso, se o usuário não inserir "all" ou "description" como o primeiro parâmetro, o padrão será uma lista de títulos que podem ou não ser o que o usuário pretendeu.

Veja o seguinte script (ou copie e cole no seu arquivo rssget.sh.

#! / bin / bash

if $ 2 = "aboutdotcom" || $ 2 = "lxer"então if $ 1 = "todos" || $ 1 = "descrição" || $ 1 = "título" então if $ 2 = "aboutdotcom" então if $ 1 = "todos" então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrição" então rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi outro if $ 1 = "todos" então rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrição" então rsstail -d -u http://lxer.com/module/newswire/headlines.rss outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi

A primeira coisa a notar é que o script agora está ficando bastante grande e você pode ver rapidamente como as instruções IF aninhadas podem se tornar descontroladas.

O bit que é importante nesse script é a instrução IF || declaração THEN seção na linha 2 e linha 4.

O || significa OR. Então a linhaif $ 2 = "aboutdotcom" || $ 2 = "lxer"verifica se o segundo parâmetro é igual a "aboutdotcom" ou "lxer". Se não for, então a instrução IF está completa porque não há outro declaração para o exterior mais E SE.

Da mesma forma na linha 4 da linha if $ 1 = "todos" || $ 1 = "descrição" || $ 1 = "título"verifica se o 1º parâmetro é igual a "all" ou "description" ou "title".

Agora, se o usuário executarsh rssget.sh batatas queijonada é retornado enquanto antes eles teriam recebido uma lista de títulos da LXER.

O oposto de || é &&. O operador && significa AND.

Eu vou fazer o script parecer ainda mais um pesadelo, mas ele faz a verificação mais importante para garantir que o usuário tenha fornecido 2 parâmetros.

#! / bin / bash

if $ # -eq 2então

if $ 2 = "aboutdotcom" || $ 2 = "lxer" então if $ 1 = "todos" || $ 1 = "descrição" || $ 1 = "título" então if $ 2 = "aboutdotcom" então if $ 1 = "todos" então rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrição" então rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi outro if $ 1 = "todos" então rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrição" então rsstail -d -u http://lxer.com/module/newswire/headlines.rss outro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi

O único bit que é extra nesse script é outra instrução IF externa da seguinte maneira:if $ # -eq 2. Se você ler o artigo sobre os parâmetros de entrada, saberá que $ # retorna uma contagem do número de parâmetros de entrada. O -eq significa igual a. A instrução IF, portanto, verifica se o usuário digitou 2 parâmetros e, se não o fez, simplesmente sai sem fazer nada. (Não particularmente amigável).

Estou ciente de que este tutorial está ficando muito grande. Não há muito mais para cobrir esta semana, mas eu quero ajudar a arrumar o roteiro antes de terminarmos.

O último comando que você precisa aprender sobre instruções condicionais é a instrução CASE.

#! / bin / bash

if $ # -eq 2então caso $ 2 em aboutdotcom) caso $ 1 em todos) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; descrição) 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 em todos) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; descrição) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; título) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi

A declaração de caso é uma maneira mais agradável de se escrever IF ELSE IF ELSE IF ELSE IF.

Por exemplo, essa lógica

SE fruta = bananasEntão issoELSE SE fruta = laranjasEntão issoELSE SE fruta = uvasEntão issoFIM SE

pode ser reescrito como:

fruta caso em bananas) faça isso ;; laranjas) faça isso ;; uvas) faça isso ;;esac

Basicamente, o primeiro item após o caso é a coisa que você vai comparar (ou seja, frutas). Então, cada item antes dos colchetes é a coisa que você está comparando e se corresponde às linhas anteriores; será executado. Uma declaração de caso é finalizada com o esac reverso (que é o caso de trás para frente).

No script rssget.sh, a instrução case remove parte desse aninhamento horrível, embora não esteja realmente melhorando o suficiente.

Para realmente melhorar o script, preciso apresentar as variáveis.

Veja o seguinte código:

#! / bin / bash

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

if $ # -lt 2 || $ # -gt 2então echo "uso: rssget.sh todos | descrição | título aboutdotcom | lxer"; Saída;fi

caso $ 1 em todos) display = "- d -l -u" ;; descrição) display = "- d -u" ;; título) display = "- u" ;;esac

caso $ 2 em aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url;

Uma variável é definida dando-lhe um nome e, em seguida, atribuindo um valor a ela. No exemplo acima, as seguintes são atribuições de variáveis:

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

O script é instantaneamente mais gerenciável usando variáveis. Por exemplo, cada parâmetro é tratado separadamente e, portanto, não há instruções IF aninhadas.

A variável de exibição agora é definida, dependendo se você escolheu all, description ou title, e a variável url é configurada para o valor da variável aboutdotcom ou o valor da variável lxer, dependendo se você escolheu aboutdotcom ou lxer.

O comando rsstail agora só precisa usar o valor de display e url para executar corretamente.

Enquanto as variáveis ​​são definidas apenas dando-lhes um nome, para usá-las, você precisa colocar um sinal $ na frente delas. Em outras palavras, variável = valor define variável como um valor, enquanto $ variável significa me fornecer o conteúdo da variável.

A seguir, o script final deste 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"uso = "uso: rssget.sh todos | descrição | título lxer | aboutdotcom | everydaylinuxuser | linuxtoday"display = ""url = ""

if $ # -lt 2 || $ # -gt 2então echo $ usage; Saída;fi

caso $ 1 em todos) display = "- d -l -u" ;; descrição) display = "- d -u" ;; título) display = "- u" ;; *) echo $ usage; Saída; ;;esac

caso $ 2 em aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; Saída;esac

rsstail $ display $ url;

O script acima introduz mais feeds RSS e há uma variável de uso que informa ao usuário como usar o script se eles não inserirem duas variáveis ​​ou inserirem opções incorretas para as variáveis.

Resumo

Este foi um artigo épico e pode ter ido longe demais cedo demais. No próximo guia, mostrarei a você todas as opções de comparação para as instruções IF e ainda há muito mais a se falar em relação às variáveis.

Há também mais coisas que podem ser feitas para melhorar o script acima e isso será abordado em futuros guias à medida que exploramos loops, grep e expressões regulares.

Confira a seção Como (rolar para baixo após as categorias para ver uma lista de artigos) do linux.about.com para encontrar guias mais úteis de inicialização dupla do Windows e Ubuntu para configurar uma máquina virtual usando caixas do GNOME.