Bash: voorwaarden (if-then-else)

Hallo

Deze keer laat ik je zien hoe je een script maakt met condition in Slaan, wat vertaald is:

Als het X-ding dat u wilt, is bereikt, wordt de Y-actie uitgevoerd, als het niet wordt bereikt, wordt een andere actie uitgevoerd.

Simpele uitleg nee 😀

Nu, ik heb een paar minuten nagedacht over een voorbeeld om in deze tutorial te gebruiken, het volgende dilemma / probleem / situatie kwam bij me op:

We zijn op het netwerk van ons bedrijf en we willen weten of de X-computer is verbonden met het netwerk. Hiervoor maken we een script wat zal hij doen ping naar die computer, en als het zich op een netwerk bevindt (dat wil zeggen, als het de ping) zal ons vertellen dat JA, het is op het netwerk, anders (dat wil zeggen, het is niet op het netwerk) zal het ons vertellen dat het NIET op het netwerk is.

Als dit eenmaal is gebeurd, zal ik nu uitleggen hoe je met voorwaarden kunt fietsen 🙂

Hier is de code:

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

Maak je geen zorgen, ik zal je dit in detail uitleggen 😉

ping is het commando dat we zullen gebruiken, en het zal ons vertellen of die pc op het netwerk is. Om u te vertellen welke pc we willen controleren of deze zich op het netwerk bevindt of niet, moeten we wijzigen IP ADRES uiteraard door het IP-adres van de pc die we willen controleren.

Zoals je kunt zien, zet ik «-c 1«, Wat nodig is voor ons. Wanneer we een computer pingen, stopt deze actie niet (de ping) totdat we zelf op drukken [Ctrl] + [C], dus zetten «-c 1»We vertellen het om slechts één verificatie uit te voeren (slechts één ping-poging) en geen andere, hierdoor zal het onmiddellijk stoppen, dat wil zeggen… het zal controleren of de computer maar één keer op het netwerk is.

Als je hier twijfels bij hebt, geen pijn ... ze zeggen het en ik zal het ze nog een keer uitleggen 😉

Nu komt de cyclus, want wat ik zojuist heb uitgelegd, is niets meer dan een normaal commando / actie 😀

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

Zodat u dit begrijpt, zal ik een uiterst belangrijk detail van Bash 🙂 uitleggen

De meest geïnformeerde van het onderwerp zou me als verkeerd kunnen bestempelen of zoiets, maar hey, ik schrijf dit voor de beginners of minder experts, zolang ze het dan goed begrijpen 😉

Het gebeurt dat zoals in Slaan het is zoiets als 0 y 1, dat wil zeggen, je leeft of je bent dood, wanneer een commando of actie wordt uitgevoerd: Ofwel goed uitgevoerd Geen probleem (1), Of er was wat probleem of fout (0).

We voeren X-actie of -opdracht uit, en wat we hebben gedaan, is mogelijk goed of slecht uitgevoerd, het kan een fout hebben gehad of niet, en dit is waar het detail is 😉

Als wat we sturen om te doen (in dit geval: ping -c 1 IP-ADRES) gaf geen fout en was succesvol, dus het retourneert de waarde: 1 . Anders, en als de actie (dat wil zeggen, de ping) niet succesvol was, retourneert deze waarde 0.

 En tot slot, wat de bovenstaande code betekent, is dit:

Als waarde 0 dan werd geretourneerd

Geef de tekst weer: «Niet op netwerk»

Anders (en NIET 0, maar 1 wordt geretourneerd)

Geef de tekst weer: «Als het in het netwerk zit«

Dit dat ik je zojuist heb uitgelegd, zal ons in de toekomst voor veel dingen van pas komen, omdat het erg handig is om te kunnen zeggen dat als X action een fout geeft, Y actie doet, en in het geval X action geen fout heeft gegeven, laat Z actie.

Ik weet dat sommigen er misschien een beetje bij betrokken raken, dus ik heb geprobeerd het op verschillende manieren uit te leggen, in een poging iedereen het op de een of andere manier te laten begrijpen. Laat het me weten als er iemand twijfelt.

Laten we nu ons script maken 😀

We moeten de stappen in deze tutorial volgen: Bash: hoe maak je een uitvoerbaar script

Laten we dan de volgende code naar dat bestand kopiëren (script.sh), en aan het einde laten we zeggen «afrit»(Zonder de aanhalingstekens):

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

Het zou er als volgt uit moeten zien (onthoud dat ze het IP-ADRES moeten hebben gewijzigd in het IP dat ze willen):

Hier kun je het lopende script zien:

% CODE1%

Zoals je kunt zien, vertelt hij ons uiteindelijk «Ja, het is in netwerk»🙂

Het belangrijkste hier is dat ze dit van de voorwaarden echt begrijpen, dus ik laat een andere code achter om het opnieuw uit te leggen, maar vanuit een ander gezichtspunt.

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

Wat dit betekent is simpel, ik verlaat de uitleg regel voor regel:

1e regel: Wat we schrijven, dat is de waarde van de variabele «tekst»(Zonder de aanhalingstekens).

2e regel: Controleer of de inhoud van de variabele (wat we zojuist hebben geschreven) is 3.

3e regel: In het geval van zijn 3, het zal ons de tekst laten zien «Corrigeer»(Zonder de aanhalingstekens).

4e regel: Anders (dat wil zeggen, voor het geval we geen 3 hebben geschreven).

5e regel: Het zal ons de tekst laten zien «Niet correct»(Zonder de aanhalingstekens).

6e regel: Einde conditie.

Zoals ze hebben kunnen realiseren, als we stellen echo en dan tussen dubbele aanhalingstekens («) een tekst, hierdoor wordt die tekst in de terminal weergegeven. Dat wil zeggen, als we stellen:

echo "esto es una prueba"

Het zal ons de tekst in de terminal laten zien: dit is een test

Maar teruggaand naar dit tweede voorbeeld, zal ik je het nut (en de uitvoering) van dit tweede script laten zien met iets HEEL eenvoudigs 😀… het typische «hoeveel is 1 + 2?«

Ik laat je de code van het volledige script achter:

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

Hier is hoe het script werkt:

% CODE2%

En tja ... niets meer toe te voegen.

Dit is iets elementair, eenvoudig ja, maar toch heb ik geprobeerd het zo goed mogelijk uit te leggen, omdat niet iedereen de ziel van een programmeur heeft, en vaak moeten we scripts zoals deze (of iets dergelijks) maken, in ieder geval hoop ik dat dit artikel nuttig voor je zal zijn iemand 🙂

Elke twijfel of vraag, klacht of suggestie, laat het hier achter, ik zal u graag antwoorden en zo leren we allemaal een beetje meer 😀

groeten


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   jhals zei

    Je bent een pro !!! *of*

    1.    KZKG ^ Gaara zei

      Nee voor niets 😀
      Als het je heeft gediend en het interessant is, ben ik tevreden 😉

      Groeten vriend

  2.   gepast zei

    @ KZKG ^ Gaara,
    over bash-programmeren gesproken, ik heb een vraag:
    Wat is het verschil tussen het declareren van een variabele zoals deze VAR = hallo en het zo declareren VAR = $ {VAR: -hello}?

    Ik leg uit:
    http://pastebin.com/a3cfWXeD

    groeten 😉

    1.    KZKG ^ Gaara zei

      Hallo
      Nou, ik ben helemaal geen expert in bash ... eigenlijk heb ik geen idee LOL !!
      Terwijl ik de variabelen declareer, is het als volgt:
      : ${OPTFOLDER:="/opt/"}

      Maar omdat ik het altijd zo heb gedaan, weet ik niet wat het verschil zou kunnen zijn 🙁

  3.   gepast zei

    @ KZKG ^ Gaara
    Nou, ik stelde de vraag omdat de waarheid is dat ik het ook niet wist, ik schrijf meestal SlackBuilds en de waarheid is dat variabelen gedeclareerd zoals in VAR1 in overvloed aanwezig zijn in deze scripts. Een snelle Google-zoekopdracht hielp me deze vraag te verduidelijken, ik deel het met iedereen zodat we allemaal kunnen leren:

    script:
    http://pastebin.com/faAQb35w

    Uitleg:
    Het declareren van variabelen in de vorm VAR = $ {VAR: -default_value} betekent dat de variabele VAR de waarde default_value aanneemt als en alleen als de waarde null is of niet bestaat.

    Praktisch voorbeeld:
    bij het uitvoeren van het script vraagt ​​het om een ​​waarde in te voeren die moet worden opgeslagen in de variabele VAR, als er iets wordt ingevoerd, zal het laten zien wat er is ingevoerd. Als we niets invoeren en op enter drukken, declareren we de variabele VAR als null, daarom wordt default_value weergegeven.

    Groeten.

    1.    KZKG ^ Gaara zei

      HAHA dat wist ik niet 😀
      Oké, heel erg bedankt vriend ... dat bedoelde ik aan het einde van het artikel, ik ben niet van plan iets te leren en dat is het, ik weet dat ik hier altijd iets nieuws zal leren 😀

      Groeten en nogmaals bedankt.

      1.    gepast zei

        je hebt gelijk, je leert hier verschillende dingen.

        groeten en fijne feestdagen !! 😀

  4.   Lucas Matthias zei

    Geweldig en uitstekend uitgelegd +1, de tijd die het je gekost heeft ...
    maar ik ben de moeite waard 😉

    1.    KZKG ^ Gaara zei

      Ik heb eigenlijk 80% geschreven in slechts 1 dag, het kostte me zo lang om het te plaatsen, alleen omdat mijn internet het me niet toestond.
      Bedankt voor je reactie 😉

  5.   Hugo zei

    Een andere manier om dit te doen is door DNS te gebruiken, aangezien netwerken soms het ICMP-protocol hebben geblokkeerd:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Verbonden met netwerk"

    U zult ook opmerken dat in dit voorbeeld de controle van de geretourneerde waarde impliciet is 😉

    1.    KZKG ^ Gaara zei

      Jij zoals altijd vriend, met tips die ik niet helemaal ken HAHAHA.
      Bedankt, de opmerking wordt op prijs gesteld en hehe ... nog een nieuw ding dat ik leer 😀

  6.   Datum zei

    bedankt

    🙂

  7.   Leper_Ivan zei

    Ook al zijn er enkele dagen verstreken sinds de publicatie van dit onderwerp, het heeft me veel gediend, nu ik een script in bash heb gemaakt .. Bedankt Gaara ..

  8.   Edgar Navarro zei

    Doc. Bedankt voor de hulp die je me duidelijk hebt gemaakt.

    Gewoon een vraag, hoe doe ik dat wanneer de ene computer stopt met automatisch pingen, de andere IP verandert. Ik heb dit.

    om het IP te wijzigen
    #! / Bin / bash
    ping -c 10 # Als het niet automatisch pingt
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 uitzending 192.168.1.0
    ifconfig eth0 omlaag
    ifconfig eth0 omhoog

  9.   Abraham zei

    want als je het vergelijkt met de als je het vraagteken gebruikt? wat is het verschil tussen het plaatsen van de? elke andere brief

    1.    KZKG ^ Gaara zei

      $? betekent 'de vorige uitvoer of uitvoer', dat wil zeggen, in het geval het resultaat van het vorige commando ... 🙂

      1.    Andrew zei

        Er is een andere manier om hetzelfde resultaat te bereiken, door de ping-opdracht rechtstreeks als argument door te geven aan if:

        als ping -c 1 IP-ADRES; vervolgens
        echo "Ja, het is op het net"
        anders
        echo "Niet op het netwerk"
        fi

        Wat er gebeurt, is dat als de geretourneerde waarde wordt geëvalueerd van de opdracht die u als argument doorgeeft, als het 0 retourneert, het waar is, en al het andere onwaar is. De vierkante haken zijn gelijk aan het testcommando. Maar u kunt elk commando als argument doorgeven (zolang het commando een waarde retourneert).

  10.   groeten zei

    Hallo, hoe voer ik een script.sh uit met een gebruiker X in het script dat ik een gebruiker Y maak, en die gebruiker Y gaat door met het uitvoeren van het script.sh

    Kan dit worden gedaan ??

  11.   kuktos zei

    Heel interessant, bedankt!

  12.   Francisco zei

    Bedankt voor de bijdrage, ik heb er een uur over gedaan om het xD te begrijpen, maar ik begreep het !!!!.

  13.   Eloy zei

    Het script is prima. Rekenkundig kan het ook worden gedaan als ($? == 0) als het gelijk is aan nul, het is niet op het netwerk, anders is het op het netwerk. En als we het toch een beetje interactiever willen maken, kunnen we zeggen:
    echo -n Voer het IP-adres in:
    lees ip
    ping -c 1 $ ip

  14.   Dario zei

    Hallo, ik ben hier erg nieuw in, ik probeer een ticketnummer (alfanumeriek) te maken door middel van een read en ik wil dat als wat wordt ingevoerd de juiste indeling heeft (ABC-123456) een "x" -opdracht uitvoeren en ik weet niet hoe ik het moet doen, kun je me helpen?

    echo "Ticket invoeren"
    lees -p ticket

    if $ ticket = "geen idee (formaat ABC-123456"); dan cp file.txt $ ticket; anders echo "verkeerd formaat, probeer het opnieuw"; lezen -p; fi.

    Natuurlijk is het vreselijk en ze lachen haha, maar zoals ik al zei, ik begin hier net mee.

    Als ik het slecht uitleg, vertel het me dan en ik probeer het beter te doen.

    Knuffel iedereen.

  15.   Umberto Y zei

    Uitstekende uitleg, groeten

  16.   Agil zei

    Ik twijfel een beetje met if, else en anderen.
    Ik wil een script om te controleren of een bestand bestaat (een van de logbestanden) en zo niet, om het aan te maken en er later naar te schrijven. Maar als het bestaat, wil ik dat je het gewoon schrijft.

    Wat ik heb is:

    datum = `datum -R`
    #Ik was de variabele datum aan het testen, die niet is bijgewerkt tussen het begin van a
    #proces en eindigt, soms kan er een uur voorbij gaan en komt de juiste tijd niet uit.

    if [-f /home/user/logs/test.log];
    harte
    raak /home/usuario/logs/test.log aan
    anders
    echo "$ datum: Bijgewerkt" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    In theorie zou het goed moeten zijn, maar de realiteit is dat het niet wordt bijgewerkt als het bestand waarnaar wordt verwezen al bestaat

    1.    Agil zei

      sorry, ik zag dat het niet is verzonden en het is verdubbeld