Bash: Villkor (om-då-annat)

Hallå

Den här gången visar jag dig hur du skapar ett manus med villkor i Bash, som översätts är:

Om X-sak du vill är klar, Y-åtgärd är klar, om det inte görs görs en annan åtgärd.

Enkel förklaring nej 😀

Nu har jag tänkt i några minuter på några exempel att använda i denna handledning, följande dilemma / problem / situation inträffade mig:

Vi är i vårt företags nätverk och vi vill veta om X-dator är ansluten till nätverket. För detta gör vi en skript vad ska han göra ping mot den datorn, och om den finns i ett nätverk (det vill säga om den returnerar ping) kommer att berätta att JA, det finns i nätverket, annars (det vill säga det är inte i nätverket) kommer det att berätta att det INTE finns i nätverket.

När detta är klart kommer jag nu att förklara hur man cyklar med förhållanden 🙂

Här är koden:

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

Oroa dig inte, jag förklarar detta för dig i detalj 😉

ping är det kommando vi kommer att använda, och det kommer att berätta om den datorn finns i nätverket. För att berätta vilken dator vi vill kontrollera om den finns i nätverket eller inte måste vi ändra IP-ADRESS av uppenbarligen IP-adressen till datorn som vi vill kontrollera.

Som ni kan se, lägger jag till «-c 1«, Vilket är nödvändigt för oss. När vi pingar en dator stoppar inte denna åtgärd (ping) förrän vi trycker på oss själva [Ctrl] + [C], så att sätta «-c 1»Vi säger att den bara ska göra en verifiering (endast ett pingförsök) och ingen annan, detta kommer att få den att stanna omedelbart, det vill säga ... den kommer att kontrollera om datorn är i nätverket bara en gång.

Om du tvivlar på detta, ingen smärta ... de säger det och jag kommer gärna förklara det för dem igen 😉

Nu kommer cykeln, för det jag just förklarade är inget annat än ett normalt kommando / handling 😀

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

Så att du förstår detta kommer jag att förklara en extremt viktig detalj av Bash 🙂

Det mest kunniga i ämnet kan stämpla mig som fel eller något liknande, men hej, jag skriver detta för nybörjare eller mindre experter, så länge de förstår det då bra 😉

Det händer att som i Bash det är ungefär som 0 y 1, det vill säga antingen du lever eller är död när ett kommando eller handling utförs: antingen utförd bra Inga problem (1) En det fanns några problem eller fel (0).

Vi utför X-handling eller kommando, och vad vi gjorde kan ha utförts bra eller dåligt, det kan ha haft ett fel eller inte, och det är här detaljerna är 😉

Om det vi skickar för att göra (i det här fallet: ping -c 1 IP-ADRESS) gav inget fel och lyckades, så det returnerar värdet: 1 . Annars, och om åtgärden (det vill säga pingen) inte lyckades, returnerar den värdet 0.

 Och slutligen, vad ovanstående kod betyder är detta:

Om värdet 0 returnerades då

Visa texten: «Inte i nätverket»

Annars (och returnera INTE 0, men 1)

Visa texten: «Om det finns i nätverket«

Detta som jag just har förklarat för dig kommer att tjäna oss i framtiden för många saker, för det är verkligen användbart att kunna säga att om X-åtgärden gav ett fel, gör Y-åtgärder, och om X-åtgärden inte har gett något fel, låt Z-åtgärden.

Jag vet att vissa kan bli lite förvirrade, så jag har försökt förklara det på flera olika sätt och försökt få alla att förstå det på ett eller annat sätt. Låt mig veta om någon lämnas i tvivel.

Låt oss nu göra vårt manus 😀

Vi måste följa stegen i denna handledning: Bash: Hur man skapar ett körbart skript

Låt oss sedan kopiera följande kod till den filen (script.sh), och i slutet ska vi säga «avsluta"(Utan citaten):

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

Det ska se ut så här (kom ihåg att de måste ha ändrat IP-ADRESSEN till den IP de vill ha):

Här kan du se det löpande skriptet:

% KOD1%

Som du kan se berättar han oss till slut «Ja det är i nätverket»🙂

Det viktiga här är att de faktiskt förstår detta om villkoren, så jag lämnar en annan kod för att förklara den igen, men ur en annan synvinkel.

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

Vad detta betyder är enkelt, jag lämnar förklaringen rad för rad:

1: a raden: Vad vi skriver, det kommer att vara värdet på variabeln «text"(Utan citaten).

2: a raden: Kontrollera om variabelns innehåll (vad vi just skrev) är 3.

3: a raden: I händelse av att vara 3, det visar oss texten «Korrigera"(Utan citaten).

4: e raden: Annars (det vill säga om vi inte har skrivit 3).

5: e raden: Det kommer att visa oss texten «Felaktig"(Utan citaten).

6: e raden: Slut på tillstånd.

Som de har kunnat förstå, om vi säger missar och sedan mellan dubbla citat («) en text, detta kommer att få texten att visas i terminalen. Det vill säga om vi säger:

echo "esto es una prueba"

Det visar oss texten i terminalen: detta är ett prov

Men när jag går tillbaka till det andra exemplet kommer jag att visa dig nyttan (och utförandet) av det andra skriptet med något MYCKET enkelt 😀 ... det typiska «hur mycket är 1 + 2?«

Jag lämnar koden för hela skriptet:

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

Så här fungerar manuset:

% KOD2%

Och ja ... inget mer att lägga till.

Detta är något elementärt, enkelt ja, men ändå har jag försökt förklara det så bra som möjligt, för inte alla har själen som en programmerare, och många gånger behöver vi göra manus som dessa (eller liknande), i alla fall jag hoppas att den här artikeln kommer att vara användbar för dig någon 🙂

Varje tvivel eller fråga, klagomål eller förslag, vänligen lämna det här, jag svarar gärna dig och därmed lär vi oss lite mer 😀

hälsningar


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   jhals sade

    Du är ett proffs !!! *eller*

    1.    KZKG ^ Gaara sade

      Nej för ingenting 😀
      Om det tjänade dig och det är intressant är jag nöjd 😉

      Hälsningar vän

  2.   rätt sade

    @ KZKG ^ Gaara,
    talar om bash programmering har jag en fråga:
    Vad är skillnaden mellan att deklarera en variabel som denna VAR = hej och att deklarera den så här VAR = $ {VAR: -hello}?

    Jag förklarar:
    http://pastebin.com/a3cfWXeD

    hälsningar 😉

    1.    KZKG ^ Gaara sade

      Hallå
      Tja, jag är inte en expert på bash alls ... faktiskt har jag ingen aning om LOL !!
      När jag förklarar variablerna är det så här:
      : ${OPTFOLDER:="/opt/"}

      Men eftersom jag alltid gjorde det så här vet jag inte vad skillnaden kan vara ärligt 🙁

  3.   rätt sade

    @ KZKG ^ Gaara
    Tja, jag ställde frågan eftersom sanningen är att jag inte visste det heller, jag brukar skriva SlackBuilds och sanningen är att variabler som deklareras som i VAR1 finns i överflöd i dessa skript. En snabb google-sökning hjälpte mig att klargöra den här frågan, jag delar den med alla så att vi alla kan lära oss:

    Manus:
    http://pastebin.com/faAQb35w

    Förklaring:
    Att deklarera variabler i formuläret VAR = $ {VAR: -default_value} betyder att variabeln VAR tar värdet default_value om och endast om värdet är null eller inte existerar.

    Praktiskt exempel:
    När man kör skriptet uppmanas man att ange ett värde som ska lagras i VAR-variabeln. Om något matas in kommer det att visa vad som angavs. Om vi ​​inte anger något och trycker på enter förklarar vi variabeln VAR som noll, därför visar den value_default.

    Hälsningar.

    1.    KZKG ^ Gaara sade

      HAHA Jag visste inte det 😀
      Ok, tack så mycket vän ... det var det jag menade i slutet av artikeln, jag tänker inte lära ut något och det är det, jag vet att jag alltid kommer att lära mig något nytt här 😀

      Hälsningar och tack än en gång.

      1.    rätt sade

        du har rätt, man lär sig flera saker här.

        hälsningar och god helg !! 😀

  4.   Lucas Matthias sade

    Fantastiskt och utmärkt förklarat +1, den tid det tar dig ...
    men jag är värt ansträngningen 😉

    1.    KZKG ^ Gaara sade

      Egentligen skrev jag 80% på bara en dag, det tog mig så lång tid att publicera det bara för att mitt internet inte tillät mig.
      Tack för din kommentar 😉

  5.   Hugo sade

    Ett annat sätt att göra det är att använda DNS, eftersom ibland nätverk har ICMP-protokoll blockerat:

    (värd -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Connected to network"

    Du kommer också att märka att i detta exempel är returvärdekontrollen implicit 😉

    1.    KZKG ^ Gaara sade

      Du som alltid vän, med tips som jag inte vet helt HAHAHA.
      Tack, kommentaren uppskattas och hehe ... en ny sak som jag lär mig 😀

  6.   Datum sade

    tack

    🙂

  7.   Leper_Ivan sade

    Även om flera dagar har gått sedan detta ämne publicerades, har det tjänat mig mycket, nu när jag gjorde ett manus i bash .. Tack Gaara ..

  8.   Edgar navarro sade

    Dok. Tack för hjälpen som du gjorde saker klart för mig.

    Bara en fråga, hur gör jag så att när en dator slutar pinga automatiskt ändrar den andra IP-adressen. Jag har den.

    för att ändra IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # om det inte pingar automatiskt
    ifconfig eth0 192.168.1.50 nätmask 255.255.255.0 sänd 192.168.1.0
    ifconfig eth0 ner
    ifconfig eth0 upp

  9.   Abraham sade

    för när man jämför med if om du använder frågetecknet? vilken skillnad är det mellan att sätta? alla andra brev

    1.    KZKG ^ Gaara sade

      $? betyder 'föregående utgång eller utgång', det vill säga om resultatet av föregående kommando ... 🙂

      1.    Andrew sade

        Det finns ett annat sätt att uppnå samma resultat genom att skicka ping-kommandot direkt som ett argument till:

        om ping -c 1 IP-ADRESS; sedan
        eko "Ja det är på nätet"
        annars
        eko "Inte i nätverket"
        fi

        Vad som händer är att om det utvärderar returvärdet för kommandot som du skickar som ett argument, om det returnerar 0 är det sant, är allt annat falskt. De hakparenteserna motsvarar testkommandot. Men du kan skicka valfritt kommando som ett argument (så länge som kommandot returnerar något värde).

  10.   hälsningar sade

    Hej, hur kör jag ett script.sh med en användare X i skriptet skapar jag en användare Y, och den användaren Y fortsätter att köra scriptet.sh

    Kan detta göras ??

  11.   kuktos sade

    Mycket intressant, tack!

  12.   Francisco sade

    Tack för bidraget, jag har varit en timme på att förstå det xD, men jag förstod det !!!!.

  13.   Eloy sade

    Manuset är bra. Aritmetiskt kan det också göras som ($? == 0) om det är lika med noll är det inte i nätverket, annars finns det i nätverket. Och om vi fortfarande vill göra det lite mer interaktivt kan vi säga:
    echo -n Ange IP:
    läs ip
    ping -c 1 $ ip

  14.   Dario sade

    Hej, jag är väldigt ny på det här, jag försöker skapa ett biljettnummer (alfanumeriskt) genom en läsning och jag vill att om det som anges har rätt format (ABC-123456) kör ett "x" -kommando och jag vet inte hur man gör det, kan du hjälpa mig?

    eko "Ange biljett"
    läs-p-biljett

    om $ ticket = "ingen idé (format ABC-123456"); sedan cp file.txt $ biljett; annars echo "fel format, försök igen"; läs -p; fi.

    Visst att det är hemskt och de skrattar haha, men som sagt så börjar jag just med det här.

    Berätta för mig om jag förklarar dåligt och jag försöker göra bättre.

    Kram alla.

  15.   Umberto Y sade

    Utmärkt förklaring, hälsningar

  16.   vig sade

    Jag tvivlar lite på if, else och andra.
    Jag vill ha ett skript för att kontrollera att en fil finns (en av loggarna) och om inte, för att skapa den och senare skriva till den. Men om det finns så vill jag att du bara skriver till det.

    Det jag har är:

    datum = `datum -R`
    #Jag testade variabelt datum, vilket inte uppdaterar mig mellan att starta en
    #bearbetar och slutar, ibland kan det gå en timme och rätt tid kommer inte ut.

    if [-f /home/user/logs/test.log];
    sedan
    tryck på /home/usuario/logs/test.log
    annars
    echo "$ datum: Uppdaterad" >> /home/user/logs/test.log
    echo «————————————————» >> /home/user/logs/test.log
    fi

    I teorin borde det vara bra, men verkligheten är att den inte uppdateras om den refererade filen redan finns

    1.    vig sade

      förlåt, jag såg att det inte skickades och det har fördubblats