Bash: Les condicions (if-then-else)

Hola 😀

En aquesta ocasió els mostraré com fer un script amb condició en xoc, La qual cosa traduït és:

Si es compleix X cosa que vostès vulguin, es fa I acció, si no es compleix llavors es fa una altra acció.

Simple l'explicació no 😀

Ara, he pensat durant uns minuts algun exemple per usar en aquest tutorial, se m'ha ocorregut el següent dilema / problema / situació:

Som a la xarxa de la nostra empresa, i desitgem saber si X ordinador està connectat a la xarxa. Per això fem una script que farà fer ping cap a aquest ordinador, i si està en xarxa (o sigui, si torna el fer ping) Ens dirà que SÍ, està en xarxa, en cas contrari (o sigui, que no estigui en xarxa) ens dirà que NO està en xarxa.

Un cop fet això, ara els explicaré com fer un cicle amb condicions 🙂

Eh aquí el codi:

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

No es preocupin, els explico això a l'detall 😉

fer ping és el comandament que farem servir, i ens dirà si aquesta PC està en xarxa. Per dir-li què PC volem comprovar si està o no en xarxa, hem de canviar DIRECCIÓ-IP per òbviament, l'adreça IP de PC que desitgem comprovar.

Com veuen, vaig posar «-c 1«, La qual cosa ens cal. Quan fem ping a un ordinador, aquesta acció no s'atura (el ping) fins que nosaltres mateixos pressionem [Ctrl] + [C], De manera que posant «-c 1»Li vam indicar que faci només una verificació (només un intent de ping) i cap altre, això farà que s'aturi a l'instant, o sigui ... comprovarà si l'ordinador està en xarxa només una vegada.

Si tenen dubtes amb això, sense pena ... ho diuen i jo amb MOLT gust se'ls explico de nou 😉

Ara ve el cicle, ja que el que acabo d'explicar no és més que una ordre / acció normal 😀

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

Perquè entenguin això, els explicaré un detall summament important de Bash 🙂

Els més coneixedors del tema em podrien titllar de equivocat o alguna cosa així, però bé, això ho escric per a la qual novells o menys experts, mentre ells ho entenguin llavors genial 😉

Passa que com a xoc és una mena 0 y 1, És a dir, o estàs viu o estàs mort, quan s'executa una ordre o acció: O es va executar bé sense problemes (1), o hi va haver algun problema o error (0).

Nosaltres vam fer X acció o comandament, i això que vam fer pot haver-se efectuat bé o malament, puc haver tingut error o no, i aquí és on hi ha el detall 😉

Si el que enviem a fer (en aquest cas: ping -c 1 DIRECCIÓ-IP) No va donar error i es va efectuar bé, llavors retornarà el valor: 1 . En cas contrari, i que l'acció (o sigui, el ping) no fos reeixit, tornarà valor 0.

 I finalment, el que significa el codi anterior és això:

Si es va retornar valor 0 llavors

Posa en pantalla el text: «No està en xarxa»

Altrament (i que es retorni NO 0, sinó 1)

Posa en pantalla el text: «Si està en xarxa«

Això que els acabo d'explicar, ens servirà en un futur per a moltíssimes coses, ja que és realment útil poder dir que si X acció va donar error, feu I acció, i en cas que X acció no hagi donat error, que faci Z acció.

Sé que a alguns podria liaros una mica, pel que he intentat explicar-ho de diverses formes diferents, intentant que tots ho entenguin d'una via o una altra. En cas que algú es quedi amb dubtes, m'ho fa saber.

Ara, fem el nostre script 😀

Hem de seguir els passos d'aquest tutorial: Bash: Com fer un script executable

Després copiem el següent codi en aquest arxiu (guió.sh), I a la fi posem «sortir de»(Sense les cometes):

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

Les ha de quedar així (recordin que han d'haver canviat DIRECCIÓ-IP per la IP que desitgen):

Aquí poden veure l'script en execució:

% CODE1%

Com veuen, a la fi ens diu «Sí està en xarxa»🙂

L'important aquí és que en realitat entenguin això de les condicions, de manera que els deixo un altre codi per tornar a explicar-ho, però des d'un altre punt de vista.

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

El que això significa és simple, els deixo línia a línia l'explicació:

1ra línia: El que escrivim, aquest serà el valor de la variable «text»(Sense les cometes).

2a línia: Comprova si el contingut de la variable (el que acabem d'escriure) és 3.

3ra línia: En cas de ser 3, Ens mostrarà el text «Correcte»(Sense les cometes).

4ta línia: Altrament (o sigui, en cas que no haguem escric 3).

5ta línia: Ens mostrarà el text «incorrecte»(Sense les cometes).

6ta línia: Fi de la condició.

Com han pogut adonar-se, si posem trobo i seguidament entre cometes dobles («) Un text, això farà que es mostri a la terminal aquest text. O sigui, si posem:

echo "esto es una prueba"

Ens mostrarà a la terminal el text: això és una prova

Però tornant a aquest segon exemple, els mostraré la utilitat (i execució) d'aquest segon script amb alguna cosa MOLT simple 😀 ... el típic «quant és 1 + 2?«

Els deixo el codi de l'script complet:

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

Els deixo aquí com funciona l'script:

% CODE2%

I bé ... res més que afegir.

Això és una cosa elemental, simple sí, però tot i així he intentat explicar-ho el millor possible, ja que no tots tenen ànima de programador, i moltes vegades necessitem fer scripts com aquests (o similars), de totes maneres espero que aquest article li sigui d'utilitat a algú 🙂

Qualsevol dubte o pregunta, queixa o suggeriment si us plau, la deixen aquí, amb molt de gust els responc i així, tots aprenem una mica més 😀

Salutacions


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Jhals va dir

    Ets un pro !!! * O *

    1.    KZKG ^ Gaara va dir

      Nah per a res 😀
      Si et va servir i resulta interessant, em dono per satisfet 😉

      Salutacions amic

  2.   correcte va dir

    @ KZKG ^ Gaara,
    parlant de programació en bash tinc un dubte:
    ¿Quina és la diferència entre declarar una variable així VAR = hola i declarar-la d'aquesta altra manera VAR = $ {VAR: -Hola}?

    m'explico:
    http://pastebin.com/a3cfWXeD

    salutacions 😉

    1.    KZKG ^ Gaara va dir

      Hola 😀
      Bé, no sóc expert en Bash ni de bon tros ... en realitat, no tinc ni idea LOL !!
      Com jo declaro les variables és així:
      : ${OPTFOLDER:="/opt/"}

      Però perquè sempre ho vaig fer així, no sé quina podria ser la diferència honestament 🙁

  3.   correcte va dir

    @ KZKG ^ Gaara
    bo la pregunta la vaig fer perquè la veritat jo tampoc sabia, jo acostumo a escriure SlackBuilds i la veritat les variables declarades com en VAR1 abunden en aquests scripts. Una ràpida recerca a google em va ajudar a aclarir aquest dubte, la comparteixo amb tots perquè tots aprenguem:

    script:
    http://pastebin.com/faAQb35w

    explicació:
    Declarar variables de la forma VAR = $ {VAR: -valor_por_defecto} vol dir que la variable VAR prendrà el valor valor_por_defecto si i només si el valor és nul o no existeix.

    Exemple pràctic:
    a l'executar l'script es demana introduir un valor per a ser emmagatzemat en la variable VAR, si s'ingressa alguna cosa mostrarà l'ingressat. Si no ingressem res i pressionem enter estem declarant a la variable VAR com nul·la, per tant mostra valor_por_defecto.

    Salutacions.

    1.    KZKG ^ Gaara va dir

      JAJA no sabia això 😀
      D'acord, moltes gràcies amic ... a això em referia amb el final de l'article, no pretenc ensenyar alguna cosa i llest res més, sé que sempre aprendré alguna cosa nova aquí 😀

      Salutacions i gràcies una vegada més.

      1.    correcte va dir

        tens raó, un aprèn diverses coses aquí.

        salutacions i bones festes !! 😀

  4.   Lucas Matías va dir

    Boníssim i excel·lentment explicat +1, el temps que t'haurà portat ...
    però valgut l'esforç 😉

    1.    KZKG ^ Gaara va dir

      En realitat vaig redactar al 80% en sol 1 dia, em vaig demorar tant en publicar-només perquè el meu internet no em deixava.
      Gràcies pel teu comentari 😉

  5.   Hugo va dir

    Una altra forma de fer-ho és utilitzant DNS, ja que de vegades les xarxes tenen bloquejat el protocol ICMP:

    (Host -ta DIRECCIÓ-IP> / dev / null 2> & 1) && echo «Connectat a la xarxa»

    A més notaran que en aquest exemple la comprovació de el valor de retorn és implícita 😉

    1.    KZKG ^ Gaara va dir

      Tu com sempre amic, amb tips que desconec completament JAJAJA.
      Gràcies, s'agraeix el comentari i jeje ... una altra coseta nova que aprenc 😀

  6.   Datux va dir

    Gràcias

    🙂

  7.   Leproso_Ivan va dir

    Tot i que han passat diversos dies des de la publicació d'aquest tema, m'ha servit molt, ara que vaig fer un script en bash .. Gràcies Gaara ..

  8.   Edgar Navarro va dir

    Doc. Gràcies per l'ajuda em vas deixar les coses clares.

    Només una consulta, com faig perquè quan un equip deixi de fer ping automàticament l'altre canviï d'IP. Tinc això.

    per canviar la IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # Si no fa ping automàticament
    ifconfig eth0 192.168.1.50 màscara de xarxa 255.255.255.0 emissió 192.168.1.0
    ifconfig eth0 baixa
    ifconfig eth0 up

  9.   Abraham va dir

    perquè a l'comparar amb l'if fas servir el signe d'interrogació? que diferència hi ha entre posar el? qualsevol altra lletra

    1.    KZKG ^ Gaara va dir

      $? significa 'la sortida o output anterior', és a dir, en cas que el resultat de la comanda anterior ... 🙂

      1.    Andrés va dir

        Hi ha una altra manera d'aconseguir el mateix resultat, passar la comanda ping directament com a argument a if:

        if ping -c 1 DIRECCIÓ-IP; then
        trobo «Sí és a la xarxa»
        else
        trobo «No està a la xarxa»
        fi

        El que passa és que if avalua el valor de retorn de la comanda que passis com a argument, si retorna 0 és veritable, qualsevol altra cosa és fals. Els parèntesi de claudàtors equivalen a la comanda test. Però pots passar qualsevol ordre com a argument (sempre que la comanda retorni algun un valor).

  10.   Salutacions va dir

    Hola com faig per executar un script.sh amb un usuari X en l'script crec un usuari I, i que l'usuari I segueixi executant el script.sh

    Es pot fer això ??

  11.   Kuktos va dir

    Molt interessant Gràcies!

  12.   Francisco va dir

    Gràcies per l'aportació, he estat una hora per entendre-ho xD, però el entesa !!!!.

  13.   Eloy va dir

    Està molt bé l'script. De forma aritmètica també es podria fer com ($? == 0) si és igual a zero no està en xarxa, en cas contrari si està en xarxa. I si encara ho volem fer una mica més interactiu li podem dir:
    echo -n Introdueix la Ip:
    read ip
    ping -c 1 $ ip

  14.   Dario va dir

    Hola, sóc molt nou en això, estic tractant de fer que a través d'un read ingressar un nombre de tiquet (alfanumèric) i vull que si el que s'ingressa té el format correcte (ABC-123456) executi una ordre «x» i no se com fer-ho, em podrian ajudar?

    trobo «Introduïu tiquet»
    read -p tiquet

    if $ tiquet = «no idea (format ABC-123456»); then cp file.txt $ tiquet; else echo «format incorrecte, ho a provar»; read -p; fi.

    segur aquesta horrible i es rian jaja, però com vaig dir estic recent començant amb això.

    Si m'expliqui mal si us plau diganme i tracte de fer-ho millor.

    Abraçada a tots.

  15.   Humberto I va dir

    Excel·lent explicació, salutacions

  16.   àgil va dir

    Tinc un petit dubte amb if, else i altres.
    Jo vull que un script comprovi que un arxiu existeix (un de logs) i si no, que ho creu i posteriorment escriviu-hi. Però si existeix vull que només escrigui al.

    El que tinc és:

    data=`date -R`
    #Estava provant variable date, que no se m'actualitza entre que comença un
    #procés i acaba, de vegades pot passar una hora i no surt l'hora correcta.

    if [ -f /home/usuari/logs/prova.log ];
    llavors
    touch /home/usuari/logs/prova.log
    else
    fet «$data: Actualitzat» >> /home/usuari/logs/prueba.log
    fet «———————————————-» >> /home/usuari/logs/prova.log
    fi

    En teoria hauria d'estar bé, però la realitat és que no s'actualitza si ja existeix el fitxer a què fa referència

    1.    àgil va dir

      perdó, veia que no s'enviava i s'ha duplicat