Bash: Betingelser (hvis-så-andet)

Hej

Denne gang vil jeg vise dig, hvordan du laver et script med tilstand i Bash, som oversættes er:

Hvis X-ting, du ønsker, er gennemført, er Y-handling udført, hvis den ikke udføres, udføres en anden handling.

Enkel forklaring nej 😀

Nu har jeg i et par minutter tænkt på et eksempel til brug i denne vejledning, følgende dilemma / problem / situation opstod for mig:

Vi er på vores virksomheds netværk, og vi vil vide, om X-computeren er forbundet til netværket. Til dette laver vi en script hvad vil han gøre ping mod den computer, og hvis den er på et netværk (dvs. hvis den returnerer ping) vil fortælle os, at JA, det er på netværket, ellers (det vil sige, det er ikke på netværket), vil det fortælle os, at det IKKE er på netværket.

Når dette er gjort, vil jeg nu forklare, hvordan man cykler med forhold 🙂

Her er koden:

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

Bare rolig, jeg forklarer dig det detaljeret 😉

ping er den kommando, vi vil bruge, og den fortæller os, om den pc er på netværket. For at fortælle dig hvilken pc vi vil kontrollere, om den er på netværket eller ej, skal vi ændre IP-ADRESSE ved naturligvis IP-adressen på pc'en, som vi vil kontrollere.

Som du kan se, satte jeg «-c 1«, Hvilket er nødvendigt for os. Når vi pinger en computer, stopper denne handling ikke (pingen), før vi trykker på os selv [Ctrl] + [C], så sætte «-c 1»Vi fortæller dig, at du kun skal foretage en verifikation (kun et ping-forsøg) og ingen andre, dette får det til at stoppe med det samme, det vil sige ... det vil kontrollere, om computeren kun er på netværket en gang.

Hvis du er i tvivl om dette, ingen smerte ... de siger det, og jeg forklarer det gerne igen 😉

Nu kommer cyklussen, for det, jeg lige har forklaret, er intet andet end en normal kommando / handling 😀

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

For at du forstår dette, vil jeg forklare en ekstremt vigtig detalje af Bash 🙂

Det mest kyndige i emnet kunne mærke mig som forkert eller noget lignende, men hej, jeg skriver dette til nybegyndere eller mindre eksperter, så længe de forstår det, så godt 😉

Det sker som i Bash det er ligesom 0 y 1, det vil sige, at du enten er i live, eller at du er død, når en kommando eller handling udføres: Enten udført godt Intet problem (1), A der var nogle problem eller fejl (0).

Vi udfører X-handling eller kommando, og hvad vi gjorde, er muligvis blevet udført godt eller dårligt, det kan have haft en fejl eller ej, og det er her detaljerne er 😉

Hvis det vi sender til at gøre (i dette tilfælde: ping -c 1 IP-ADRESSE) gav ikke en fejl, og det blev gjort godt, så det returnerer værdien: 1 . Ellers, og hvis handlingen (det vil sige ping) ikke lykkedes, returnerer den værdi 0.

 Og endelig, hvad ovenstående kode betyder er dette:

Hvis værdi 0 blev returneret derefter

Vis teksten: «Ikke på netværket»

Ellers (og returner IKKE 0, men 1)

Vis teksten: «Hvis det er i netværket«

Dette, som jeg lige har forklaret dig, vil tjene os i fremtiden for mange ting, fordi det er virkelig nyttigt at kunne sige, at hvis X-handling gav en fejl, skal du gøre Y-handling, og hvis X-handling ikke har givet en fejl, gør derefter Z-handling.

Jeg ved, at nogle måske bliver lidt forvirrede, så jeg har forsøgt at forklare det på flere forskellige måder og forsøgt at få alle til at forstå det på en eller anden måde. Hvis nogen efterlades i tvivl, så lad mig det vide.

Lad os nu lave vores script 😀

Vi skal følge trinene i denne vejledning: Bash: Sådan oprettes et eksekverbart script

Lad os så kopiere følgende kode til den fil (script.sh), og lad os til sidst sige «frakørsel»(Uden citaterne):

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

Det skal se sådan ud (husk at du skal have ændret IP-ADRESSEN til den ønskede IP):

Her kan du se det kørende script:

% KODE1%

Som du kan se, til sidst fortæller han os «Ja det er i netværket»🙂

Det vigtige her er, at de faktisk forstår dette af betingelserne, så jeg efterlader dig en anden kode for at forklare det igen, men fra et andet synspunkt.

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

Hvad dette betyder er simpelt, jeg forlader forklaringen linje for linje:

1. linje: Hvad vi skriver, det vil være værdien af ​​variablen «tekst»(Uden citaterne).

2. linje: Kontroller, om indholdet af variablen (hvad vi lige har skrevet) er 3.

3. linje: I tilfælde af at være 3, det viser os teksten «højre»(Uden citaterne).

4. linje: Ellers (dvs. hvis vi ikke har skrevet 3).

5. linje: Det viser os teksten «Ukorrekt»(Uden citaterne).

6. linje: Slut på tilstanden.

Hvordan kunne de have indset, hvis vi sætter det ekko og derefter mellem dobbelt anførselstegn («) en tekst, dette vil medføre, at teksten vises i terminalen. Det vil sige, hvis vi sætter:

echo "esto es una prueba"

Det viser os teksten i terminalen: dette er en test

Men når jeg går tilbage til dette andet eksempel, vil jeg vise dig nytten (og udførelsen) af dette andet script med noget MEGET simpelt 😀 ... det typiske «hvor meget koster 1 + 2?«

Jeg efterlader koden til det komplette script:

#!/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ådan fungerer scriptet:

% KODE2%

Og godt ... intet mere at tilføje.

Dette er noget elementært, simpelt ja, men jeg har stadig forsøgt at forklare det så godt som muligt, for ikke alle har sjælen som en programmør, og mange gange er vi nødt til at lave scripts som disse (eller lignende), under alle omstændigheder håber denne artikel vil være nyttig for dig nogen 🙂

Enhver tvivl eller spørgsmål, klage eller forslag, lad det være her, jeg vil gerne svare dig, og dermed lærer vi alle lidt mere 😀

hilsen


26 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   jhals sagde han

    Du er en professionel !!! *eller*

    1.    KZKG ^ Gaara sagde han

      Nej for ingenting 😀
      Hvis det tjente dig, og det er interessant, er jeg tilfreds 😉

      Hilsen ven

  2.   passende sagde han

    @ KZKG ^ Gaara,
    taler om bash programmering har jeg et spørgsmål:
    Hvad er forskellen mellem at erklære en variabel som denne VAR = hej og at erklære den som denne VAR = $ {VAR: -hello}?

    Jeg forklarer:
    http://pastebin.com/a3cfWXeD

    hilsner 😉

    1.    KZKG ^ Gaara sagde han

      Hej
      Nå, jeg er overhovedet ikke ekspert i bash ... faktisk aner jeg ikke LOL !!
      Når jeg erklærer variablerne, er det sådan:
      : ${OPTFOLDER:="/opt/"}

      Men fordi jeg altid gjorde det sådan her, ved jeg ikke, hvad forskellen kunne være ærligt 🙁

  3.   passende sagde han

    @ KZKG ^ Gaara
    Nå, jeg stillede spørgsmålet, fordi sandheden er, at jeg heller ikke vidste, jeg skriver normalt SlackBuilds, og sandheden er, at variabler, der er erklæret som i VAR1, findes i overflod i disse scripts. En hurtig google-søgning hjalp mig med at afklare dette spørgsmål, jeg deler det med alle, så vi alle kan lære:

    script:
    http://pastebin.com/faAQb35w

    Forklaring:
    Erklæring af variabler i formen VAR = $ {VAR: -default_value} betyder, at variablen VAR tager værdien default_value, hvis og kun hvis værdien er nul eller ikke findes.

    Praktisk eksempel:
    Når man udfører scriptet, bliver det bedt om at indtaste en værdi, der skal gemmes i VAR-variablen. Hvis der indtastes noget, vil det vise, hvad der blev indtastet. Hvis vi ikke indtaster noget og trykker på enter, erklærer vi variablen VAR som nul, derfor viser den value_default.

    Greetings.

    1.    KZKG ^ Gaara sagde han

      HAHA Det vidste jeg ikke 😀
      Ok, tak meget ven ... det var det, jeg mente i slutningen af ​​artiklen, jeg har ikke til hensigt at lære noget, og det er det, jeg ved, at jeg altid vil lære noget nyt her 😀

      Hilsner og tak igen.

      1.    passende sagde han

        du har ret, man lærer flere ting her.

        hilsner og glædelig ferie !! 😀

  4.   Lucas Matthias sagde han

    Fantastisk og fremragende forklaret +1, den tid det vil have taget dig ...
    men jeg er besværet værd 😉

    1.    KZKG ^ Gaara sagde han

      Faktisk skrev jeg 80% på bare 1 dag, det tog mig så lang tid at offentliggøre det bare fordi mit internet ikke ville lade mig.
      Tak for din kommentar 😉

  5.   Hugo sagde han

    En anden måde at gøre det på er at bruge DNS, da netværk nogle gange har ICMP-protokol blokeret:

    (vært -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Forbundet til netværk"

    Du vil også bemærke, at returværdikontrollen i dette eksempel er implicit 😉

    1.    KZKG ^ Gaara sagde han

      Du som altid ven, med tip, som jeg ikke kender helt HAHAHA.
      Tak, kommentaren værdsættes, og hehe ... en anden ny ting, som jeg lærer 😀

  6.   Dato sagde han

    Tak

    🙂

  7.   Leper_Ivan sagde han

    Selvom der er gået flere dage siden offentliggørelsen af ​​dette emne, har det tjent mig meget, nu hvor jeg lavede et script i bash .. Tak Gaara ..

  8.   Edgar navarro sagde han

    Dok. Tak for den hjælp, du gjorde tingene klart for mig.

    Bare en forespørgsel, hvordan gør jeg det, når den ene computer holder op med at pinge automatisk, skifter den anden IP. Jeg har det.

    for at ændre IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # Hvis den ikke ping automatisk
    ifconfig eth0 192.168.1.50 netmaske 255.255.255.0 udsendt 192.168.1.0
    ifconfig eth0 nede
    ifconfig eth0 op

  9.   Abraham sagde han

    fordi når man sammenligner med hvis du bruger spørgsmålstegnet? hvilken forskel er der mellem at sætte? ethvert andet brev

    1.    KZKG ^ Gaara sagde han

      $? betyder 'forrige output eller output', det vil sige i tilfælde af resultatet af den forrige kommando ... 🙂

      1.    Andrew sagde han

        Der er en anden måde at opnå det samme resultat ved at sende ping-kommandoen direkte som et argument til, hvis:

        hvis ping -c 1 IP-ADRESSE; derefter
        ekko "Ja det er på nettet"
        andet
        ekko "Ikke på netværket"
        fi

        Hvad der sker er, at hvis den evaluerer returværdien af ​​den kommando, du sender som et argument, og hvis den returnerer 0, er det sandt, er alt andet forkert. De firkantede parenteser svarer til testkommandoen. Men du kan videregive enhver kommando som et argument (så længe kommandoen returnerer en værdi).

  10.   hilsen sagde han

    Hej, hvordan udfører jeg et script.sh med en bruger X i scriptet opretter jeg en bruger Y, og den bruger Y fortsætter med at udføre scriptet.sh

    Kan dette gøres ??

  11.   kuktos sagde han

    Meget interessant, tak!

  12.   Francisco sagde han

    Tak for bidraget, jeg har været en time til at forstå det xD, men jeg forstod det !!!!.

  13.   Eloy sagde han

    Manuskriptet er fint. Aritmetisk kunne det også gøres som ($? == 0), hvis det er lig med nul, er det ikke på netværket, ellers er det på netværket. Og hvis vi stadig vil gøre det lidt mere interaktivt, kan vi sige:
    echo -n Indtast IP:
    læs ip
    ping -c 1 $ ip

  14.   Dario sagde han

    Hej, jeg er meget ny på dette, jeg prøver at lave et billetnummer (alfanumerisk) gennem en læsning, og jeg vil have, at hvis det indtastede har det korrekte format (ABC-123456), udfører en "x", og det gør jeg ikke ved hvordan man gør det, kan du hjælpe mig?

    ekko "Indtast billet"
    læse-p billet

    hvis $ ticket = "ingen idé (format ABC-123456"); derefter cp file.txt $ billet; ellers ekko "Forkert format, prøv igen"; læse -p; fi.

    Sikker på, at det er forfærdeligt, og de griner haha, men som jeg sagde, begynder jeg lige med dette.

    Hvis jeg forklarer dårligt, så fortæl mig det, og jeg prøver at gøre det bedre.

    Knus alle.

  15.   Umberto Y sagde han

    Fremragende forklaring, hilsner

  16.   adræt sagde han

    Jeg er lidt i tvivl med if, else og andre.
    Jeg vil have et script til at kontrollere, at en fil eksisterer (en af ​​logfiler), og hvis ikke, for at oprette den og senere skrive til den. Men hvis den findes, vil jeg gerne have, at du bare skriver til den.

    Det jeg har er:

    dato = `dato -R`
    #Jeg testede variabel dato, som ikke er opdateret mellem starten af ​​en
    #proces og slutter, nogle gange kan der gå en time, og det korrekte tidspunkt kommer ikke ud.

    if [-f /home/user/logs/test.log];
    derefter
    tryk på /home/usuario/logs/test.log
    andet
    echo "$-dato: Opdateret" >> /home/user/logs/test.log
    echo «————————————————» >> /home/user/logs/test.log
    fi

    I teorien burde det være fint, men virkeligheden er, at den ikke opdateres, hvis den refererede fil allerede eksisterer

    1.    adræt sagde han

      undskyld, jeg så, at det ikke blev sendt, og det er fordoblet