Bash: Condições (if-then-else)

Olá

Desta vez, vou mostrar como fazer um script com condição em Bater, que traduzido é:

Se X coisa que você deseja for realizada, a ação Y é realizada, se não for realizada, então outra ação é realizada.

Explicação simples não 😀

Agora, pensei por alguns minutos em algum exemplo para usar neste tutorial, o seguinte dilema / problema / situação me ocorreu:

Estamos na rede da nossa empresa e queremos saber se o computador X está conectado à rede. Para isso fazemos um escrita que vai fazer sibilo em relação a esse computador, e se estiver em uma rede (ou seja, se ele retornar o sibilo) nos dirá que SIM, está na rede, caso contrário (ou seja, não está na rede), ele nos dirá que NÃO está na rede.

Depois de fazer isso, agora vou explicar como fazer um ciclo com condições 🙂

Aqui está o código:

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Não se preocupe, vou explicar isso em detalhes 😉

sibilo é o comando que usaremos e nos dirá se o PC está na rede. Para saber qual PC queremos verificar se ele está ou não na rede, devemos mudar DIREÇÃO IP obviamente pelo endereço IP do PC que queremos verificar.

Como você pode ver, eu coloquei «-c 1«, O que é necessário para nós. Quando fazemos ping em um computador, essa ação não para (o ping) até que nos pressionemos [Ctrl] + [C], então colocando «-c 1»Dizemos para você fazer apenas uma verificação (apenas uma tentativa de ping) e nenhuma outra, isso fará com que pare instantaneamente, ou seja ... verificará se o computador está na rede apenas uma vez.

Se você tem dúvidas sobre isso, sem dor ... dizem e terei o maior prazer em explicar novamente 😉

Agora vem o ciclo, porque o que acabei de explicar nada mais é do que um comando / ação normal 😀

if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Para que você entenda isso, vou explicar um detalhe extremamente importante do Bash 🙂

O mais conhecedor do assunto poderia me marcar como errado ou algo assim, mas hey, eu escrevo isso para os novatos ou menos especialistas, desde que eles entendam, então ótimo great

Acontece que como em Bater é algo como 0 y 1, ou seja, ou você está vivo ou morto, quando um comando ou ação é executado: bem executado Sem problemas (1), A havia algum problema ou erro (0).

Executamos a ação ou comando X, e o que fizemos pode ter sido executado bem ou mal, pode ter havido um erro ou não, e é aqui que está o detalhe 😉

Se o que enviamos para fazer (neste caso: ping -c 1 IP-ADDRESS) não deu um erro e foi bem-sucedido, então retornará o valor: 1 . Caso contrário, e se a ação (ou seja, o ping) não for bem-sucedida, ele retornará o valor 0.

 E, finalmente, o que o código acima significa é:

Se o valor 0 foi retornado, então

Exibir o texto: «Fora da rede»

Caso contrário (e retorne NÃO 0, mas 1)

Exibir o texto: «Se estiver na rede«

Isso que acabei de explicar a você, vai nos servir no futuro para muitas coisas, porque é muito útil poder dizer que se a ação X deu um erro, faça a ação Y, e caso a ação X não tenha dado um erro, deixe Z ação.

Sei que alguns podem ficar um pouco confusos, então tentei explicar de várias maneiras diferentes, tentando fazer com que todos entendessem de uma forma ou de outra. Caso alguém fique em dúvida, avise-me.

Agora, vamos fazer nosso script 😀

Devemos seguir as etapas deste tutorial: Bash: como fazer um script executável

Então, vamos copiar o seguinte código para esse arquivo (script.sh), e no final vamos dizer «saída"(Sem as aspas):

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

Deve ser parecido com isto (lembre-se de que eles devem ter alterado o IP-ADDRESS para o IP que desejam):

Aqui você pode ver o script em execução:

% CODE1%

Como você pode ver, no final ele nos diz «Sim está na rede🙂

O importante aqui é que eles realmente entendam isso sobre as condições, então deixo outro código para explicar novamente, mas de outro ponto de vista.

read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi

O que isso significa é simples, deixo a explicação linha por linha:

1ª linha: O que escrevermos, esse será o valor da variável «texto"(Sem as aspas).

2ª linha: Verifique se o conteúdo da variável (o que acabamos de escrever) é 3.

3ª linha: Em caso de ser 3, vai nos mostrar o texto «Corrija"(Sem as aspas).

4ª linha: Caso contrário (isto é, caso não tenhamos escrito 3).

5ª linha: Ele vai nos mostrar o texto «Errado"(Sem as aspas).

6ª linha: Fim da condição.

Como eles foram capazes de perceber, se colocarmos eco e depois entre aspas duplas («) um texto, isso fará com que esse texto seja exibido no terminal. Ou seja, se colocarmos:

echo "esto es una prueba"

Ele nos mostrará o texto no terminal: isso é uma Prov a

Mas, voltando a este segundo exemplo, vou mostrar a você a utilidade (e execução) desse segundo script com algo MUITO simples typical… o típico «quanto é 1 + 2?«

Deixo-vos o código do script completo:

#!/bin/bash
# -*- ENCODING: UTF-8 -*-
echo "¿Cuánto es 1 + 2?"
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
exit

Veja como o script funciona:

% CODE2%

E bem ... nada mais a acrescentar.

Isso é algo elementar, simples sim, mas ainda tentei explicar da melhor maneira possível, pois nem todo mundo tem alma de programador, e muitas vezes precisamos fazer scripts como esses (ou similares), em todo caso eu espero que este artigo seja útil para você 🙂

Qualquer dúvida ou dúvida, reclamação ou sugestão deixe aqui, terei prazer em responder e assim, todos nós aprenderemos um pouco mais 😀

lembranças


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   jhals dito

    Você é um profissional !!! *ou*

    1.    KZKG ^ Gaara dito

      Nah por nada 😀
      Se serviu a você e é interessante, estou satisfeito 😉

      Saudações amigo

  2.   adequado dito

    @ KZKG ^ Gaara,
    por falar em programação bash, tenho uma pergunta:
    Qual é a diferença entre declarar uma variável como VAR = hello e declarar VAR = $ {VAR: -hello}?

    Quero dizer:
    http://pastebin.com/a3cfWXeD

    saudações 😉

    1.    KZKG ^ Gaara dito

      Olá
      Bem, eu não sou um especialista em bash ... na verdade, eu não tenho ideia LOL !!
      Conforme eu declaro as variáveis, é assim:
      : ${OPTFOLDER:="/opt/"}

      Mas como sempre fiz assim, não sei qual poderia ser a diferença, honestamente 🙁

  3.   adequado dito

    @ KZKG ^ Gaara
    Bem, eu fiz a pergunta porque a verdade é que eu também não sabia, eu geralmente escrevo SlackBuilds e a verdade é que as variáveis ​​declaradas como em VAR1 são abundantes nesses scripts. Uma rápida pesquisa no google ajudou-me a esclarecer esta questão, partilho-a com todos para que todos possamos aprender:

    Script:
    http://pastebin.com/faAQb35w

    Explicação:
    Declarar variáveis ​​no formato VAR = $ {VAR: -default_value} significa que a variável VAR terá o valor default_value se e somente se o valor for nulo ou não existir.

    Exemplo prático:
    Ao executar o script, é solicitada a inserção de um valor a ser armazenado na variável VAR, se algo for inserido mostrará o que foi inserido. Se não inserirmos nada e pressionarmos enter, estaremos declarando a variável VAR como nula, portanto, ela mostra valor_padrão.

    Saudações.

    1.    KZKG ^ Gaara dito

      HAHA Eu não sabia disso 😀
      Ok, muito obrigado amigo ... foi isso que quis dizer com o final do artigo, não pretendo ensinar nada e pronto, sei que sempre vou aprender algo novo aqui 😀

      Saudações e obrigado mais uma vez.

      1.    adequado dito

        tem razão, aprende-se várias coisas aqui.

        saudações e boas festas !! 😀

  4.   Lucas matias dito

    Muito bem e bem explicado +1, o tempo que vai demorar ...
    mas valho o esforço 😉

    1.    KZKG ^ Gaara dito

      Na verdade, escrevi 80% em apenas 1 dia, demorei muito para postar só porque minha internet não permitiu.
      Obrigado pelo seu comentário 😉

  5.   Hugo dito

    Outra forma de fazer isso é usando DNS, já que às vezes as redes têm o protocolo ICMP bloqueado:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Conectado à rede"

    Você também notará que, neste exemplo, a verificação do valor de retorno está implícita 😉

    1.    KZKG ^ Gaara dito

      Você como sempre amigo, com dicas que não conheço completamente HAHAHA.
      Obrigado, o comentário é apreciado e hehe ... outra coisa nova que eu aprendi 😀

  6.   Encontro dito

    obrigado

    🙂

  7.   Leper_Ivan dito

    Mesmo que vários dias tenham se passado desde a publicação deste tópico, ele me serviu muito, agora que fiz um script em bash .. Obrigado Gaara ..

  8.   Edgar navarro dito

    Doc. Obrigado pela ajuda que você deixou as coisas claras para mim.

    Apenas uma consulta, como faço para que quando um computador para de pingar automaticamente o outro mude de IP. Eu tenho isto.

    para mudar o IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # se não pingar automaticamente
    ifconfig eth0 192.168.1.50 máscara de rede 255.255.255.0 transmissão 192.168.1.0
    ifconfig eth0 para baixo
    ifconfig eth0 up

  9.   Abraham dito

    porque ao comparar com o se você usar o ponto de interrogação? que diferença há entre colocar o? qualquer outra carta

    1.    KZKG ^ Gaara dito

      $? significa 'a saída ou saída anterior', ou seja, no caso do resultado do comando anterior ... 🙂

      1.    Andrew dito

        Há outra maneira de obter o mesmo resultado, passando o comando ping diretamente como um argumento para se:

        se ping -c 1 IP-ADDRESS; então
        echo "Sim, está na rede"
        outro
        echo "Não está na rede"
        fi

        O que acontece é que se avalia o valor de retorno do comando que você passa como argumento, se retorna 0 é verdadeiro, todo o resto é falso. Os colchetes são equivalentes ao comando de teste. Mas você pode passar qualquer comando como argumento (desde que o comando retorne algum valor).

  10.   lembranças dito

    Olá, como faço para executar um script.sh com um usuário X no script eu crio um usuário Y, e esse usuário Y continua executando o script.sh

    Isso pode ser feito ??

  11.   kuktos dito

    Muito interessante, obrigado!

  12.   Francisco dito

    Obrigado pela contribuição, já levei uma hora para entender xD, mas entendi !!!!.

  13.   Eloy dito

    O script está bom. Aritmeticamente, também poderia ser feito como ($? == 0) se for igual a zero não está na rede, caso contrário, está na rede. E se ainda quisermos torná-lo um pouco mais interativo, podemos dizer:
    echo -n Digite o IP:
    ler ip
    ping -c 1 $ ip

  14.   Dario dito

    Olá, sou muito novo nisso, estou tentando fazer um número de tíquete (alfanumérico) por meio de uma leitura e quero que se o que foi inserido estiver no formato correto (ABC-123456) execute um comando "x" e não não sei como fazer, você poderia me ajudar?

    echo "Enter ticket"
    leia -p bilhete

    if $ ticket = "nenhuma ideia (formato ABC-123456"); então cp file.txt $ ticket; senão echo "formato errado, tente novamente"; ler -p; fi.

    Claro que é horrível e eles riem haha, mas como eu disse, estou apenas começando com isso.

    Se eu explicar mal, por favor me diga e eu tento fazer melhor.

    Abraço a todos.

  15.   Humberto J. dito

    Excelente explicação, saudações

  16.   ágil dito

    Tenho um pouco de dúvida com if, else e outros.
    Quero um script para verificar se existe um arquivo (um dos logs) e, caso não exista, para criá-lo e depois gravá-lo. Mas se existir, quero que você apenas escreva para ele.

    O que eu tenho é:

    data = `data -R`
    #Eu estava testando a data variável, que não é atualizada entre o início de um
    #processo e termina, às vezes pode passar uma hora e não sai a hora certa.

    if [-f /home/user/logs/test.log];
    então
    toque em /home/usuario/logs/test.log
    outro
    echo "$ date: Atualizado" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Em teoria deveria estar bem, mas a realidade é que não é atualizado se o arquivo referenciado já existe

    1.    ágil dito

      desculpe, vi que não foi enviado e dobrou