Bash: Forhold (hvis-da-annet)

Hallo

Denne gangen vil jeg vise deg hvordan du lager et skript med tilstand i Bash, som oversettes er:

Hvis X-ting du vil ha er ferdig, er Y-handling gjort, hvis det ikke er gjort, blir en annen handling gjort.

Enkel forklaring nei 😀

Nå har jeg tenkt i noen minutter på noen eksempler å bruke i denne opplæringen, følgende dilemma / problem / situasjon skjedde for meg:

Vi er på selskapets nettverk, og vi vil vite om X-datamaskin er koblet til nettverket. For dette lager vi en script hva vil han gjøre ping mot datamaskinen, og hvis den er i et nettverk (det vil si hvis den returnerer ping) vil fortelle oss at JA, det er på nettverket, ellers (det vil si at det ikke er på nettverket) vil det fortelle oss at det IKKE er på nettverket.

Når dette er gjort, vil jeg nå forklare hvordan jeg skal sykle 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

Ikke bekymre deg, jeg forklarer dette i detalj 😉

ping er kommandoen vi vil bruke, og den vil fortelle oss om den PC-en er på nettverket. For å fortelle deg hvilken PC vi vil sjekke om den er på nettverket eller ikke, må vi endre IP ADRESSE av åpenbart IP-adressen til PC-en vi vil sjekke.

Som du ser, la jeg «-c 1«, Som er nødvendig for oss. Når vi pinger en datamaskin, stopper ikke denne handlingen (pingen) før vi trykker på oss selv [Ctrl] + [C], så å sette «-c 1»Vi ber deg om å gjøre bare en bekreftelse (bare ett pingforsøk) og ingen andre, dette vil få den til å stoppe øyeblikkelig, det vil si ... den vil sjekke om datamaskinen bare er i nettverket en gang.

Hvis du er i tvil med dette, ingen smerte ... de sier det, og jeg vil forklare det for dem igjen 😉

Nå kommer syklusen, for det jeg nettopp forklarte, er ikke noe mer enn en vanlig 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 viktig detalj av Bash 🙂

Det mest kunnskapsrike av emnet kan merke meg som feil eller noe sånt, men hei, jeg skriver dette for nybegynnere eller mindre eksperter, så lenge de forstår det, så flott 😉

Det skjer som i Bash det er noe sånt som 0 y 1, det vil si at enten du lever eller at du er død når en kommando eller handling utføres: Enten utført godt Ikke noe problem (1), A det var noen problem eller feil (0).

Vi utfører X-handling eller kommando, og det vi gjorde kan ha blitt utført bra eller dårlig, det kan ha hatt en feil eller ikke, og det er her detaljene er 😉

Hvis det vi sender for å gjøre (i dette tilfellet: ping -c 1 IP-ADRESSE) ga ingen feil og lyktes, så den vil returnere verdien: 1 . Ellers, og hvis handlingen (det vil si pingen) ikke lyktes, vil den returnere verdien 0.

 Og til slutt, hva koden ovenfor betyr er dette:

Hvis verdien 0 ble returnert da

Vis teksten: «Ikke på nettverket»

Ellers (og returner IKKE 0, men 1)

Vis teksten: «Hvis det er i nettverket«

Dette som jeg nettopp har forklart deg, vil tjene oss i fremtiden for mange ting, fordi det er veldig nyttig å kunne si at hvis X-handling ga en feil, gjør Y-handling, og i tilfelle X-handling ikke har gitt en feil, så gjør Z-handling.

Jeg vet at noen kan bli litt forvirret, så jeg har prøvd å forklare det på flere forskjellige måter og prøver å få alle til å forstå det på en eller annen måte. Gi beskjed hvis noen blir igjen i tvil.

La oss lage skriptet vårt 😀

Vi må følge trinnene i denne opplæringen: Bash: Hvordan lage et kjørbart skript

La oss deretter kopiere følgende kode inn i den filen (script.sh), og til slutt la oss si «avslutte»(Uten anførselstegn):

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

Det skal se slik ut (husk at de må ha endret IP-ADRESSEN til IP-en de ønsker):

Her kan du se det løpende skriptet:

% KODE1%

Som du ser, til slutt forteller han oss «Ja det er i nettverket»🙂

Det viktige her er at de faktisk forstår dette av forholdene, så jeg lar deg en annen kode for å forklare det igjen, men fra et annet synspunkt.

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

Hva dette betyr er enkelt, jeg legger forklaringen linje for linje:

1. linje: Det vi skriver, det vil være verdien av variabelen «tekst»(Uten sitatene).

2. linje: Sjekk om innholdet i variabelen (det vi nettopp skrev) er 3.

3. linje: I tilfelle å være 3, det viser oss teksten «Korrigere»(Uten sitatene).

4. linje: Ellers (det vil si i tilfelle vi ikke har skrevet 3).

5. linje: Den vil vise oss teksten «stemmer ikke»(Uten sitatene).

6. linje: Slutten på tilstanden.

Som de har klart å forstå, hvis vi setter det savner og deretter mellom doble anførselstegn («) en tekst, vil dette føre til at teksten vises i terminalen. Det vil si hvis vi setter:

echo "esto es una prueba"

Det viser oss teksten i terminalen: dette er en test

Men når jeg går tilbake til dette andre eksemplet, vil jeg vise deg nytten (og utførelsen) av dette andre skriptet med noe VELDIG enkelt 😀 ... det typiske «hvor mye er 1 + 2?«

Jeg legger igjen koden til hele 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

Slik fungerer skriptet:

% KODE2%

Og vel ... ingenting mer å legge til.

Dette er noe elementært, enkelt ja, men jeg har fortsatt prøvd å forklare det så godt som mulig, for ikke alle har sjelen til en programmerer, og mange ganger trenger vi å lage manus som disse (eller lignende), i alle fall håper jeg denne artikkelen vil være nyttig for deg noen 🙂

Eventuell tvil, spørsmål, klage eller forslag, vær så snill, la det være her, jeg vil gjerne svare deg og dermed lærer vi alle litt mer 😀

Hilsen


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

      jhals sa

    Du er en proff !!! *eller*

         KZKG ^ Gaara sa

      Nei for ingenting 😀
      Hvis det tjente deg og det er interessant, er jeg fornøyd 😉

      Hilsen venn

      ordentlig sa

    @ KZKG ^ Gaara,
    snakker om bash programmering har jeg et spørsmål:
    Hva er forskjellen mellom å erklære en variabel som denne VAR = hei og å erklære den slik som denne VAR = $ {VAR: -hello}?

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

    hilsener 😉

         KZKG ^ Gaara sa

      Hallo
      Vel, jeg er ikke en ekspert i bash i det hele tatt ... faktisk aner jeg ikke LOL !!
      Når jeg erklærer variablene, er det slik:
      : ${OPTFOLDER:="/opt/"}

      Men fordi jeg alltid gjorde det slik, vet jeg ikke hva forskjellen kan være ærlig 🙁

      ordentlig sa

    @ KZKG ^ Gaara
    Vel, jeg stilte spørsmålet fordi sannheten er at jeg ikke visste det heller, jeg skriver vanligvis SlackBuilds, og sannheten er at variabler som er erklært som i VAR1 florerer i disse skriptene. Et raskt google-søk hjalp meg med å avklare dette spørsmålet, jeg deler det med alle slik at vi alle kan lære:

    Manus:
    http://pastebin.com/faAQb35w

    Forklaring:
    Å erklære variabler i skjemaet VAR = $ {VAR: -default_value} betyr at variabelen VAR vil ta verdien default_value hvis og bare hvis verdien er null eller ikke eksisterer.

    Praktisk eksempel:
    Når man utfører skriptet, blir det bedt om å oppgi en verdi som skal lagres i VAR-variabelen. Hvis noe er skrevet inn, vil det vise hva som ble angitt. Hvis vi ikke skriver inn noe og trykker på enter, erklærer vi variabelen VAR som null, derfor viser den value_default.

    Hilsener.

         KZKG ^ Gaara sa

      HAHA Det visste jeg ikke 😀
      Ok, tusen takk venn ... det var det jeg mente på slutten av artikkelen, jeg har ikke tenkt å lære noe og det er det, jeg vet at jeg alltid vil lære noe nytt her 😀

      Hilsen og takk igjen.

           ordentlig sa

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

        hilsener og god ferie !! 😀

      Lucas Matthias sa

    Fantastisk og utmerket forklart +1, tiden det vil ha tatt deg ...
    men jeg er verdt innsatsen 😉

         KZKG ^ Gaara sa

      Egentlig skrev jeg 80% på bare en dag, det tok meg så lang tid å publisere det bare fordi internett ikke lot meg.
      Takk for kommentaren din 😉

      Hugo sa

    En annen måte å gjøre det på er å bruke DNS, siden nettverk noen ganger har ICMP-protokollen blokkert:

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

    Du vil også legge merke til at i dette eksemplet er returverdikontrollen implisitt 😉

         KZKG ^ Gaara sa

      Du som alltid venn, med tips som jeg ikke kjenner helt HAHAHA.
      Takk, kommentaren blir satt pris på og hehe ... en annen ny ting som jeg lærer 😀

      Dato sa

    Takk

    ????

      Leper_Ivan sa

    Selv om det har gått flere dager siden publiseringen av dette emnet, har det tjent meg mye, nå som jeg laget et manus i bash .. Takk Gaara ..

      Edgar navarro sa

    Dok. Takk for hjelpen du gjorde ting klart for meg.

    Bare et spørsmål, hvordan gjør jeg det når en datamaskin slutter å pinge automatisk, den andre endrer IP. Jeg har dette.

    for å endre IP
    #! / Bin / bash
    ping -c 10 192.168.1.50 # Hvis den ikke pinger automatisk
    ifconfig eth0 192.168.1.50 nettmaske 255.255.255.0 kringkasting 192.168.1.0
    ifconfig eth0 ned
    ifconfig eth0 opp

      Abraham sa

    fordi når man sammenligner med hvis du bruker spørsmålstegnet? hvilken forskjell er det mellom å sette? ethvert annet brev

         KZKG ^ Gaara sa

      $? betyr 'forrige utgang eller utgang', det vil si i tilfelle resultatet av forrige kommando ... 🙂

           Andrew sa

        Det er en annen måte å oppnå samme resultat ved å sende ping-kommandoen direkte som et argument til hvis:

        hvis ping -c 1 IP-ADRESSE; deretter
        ekko "Ja, det er på nettet"
        ellers
        ekko "Ikke på nettverket"
        fi

        Det som skjer er at hvis den evaluerer returverdien til kommandoen du sender som et argument, hvis den returnerer 0 er det sant, er alt annet falskt. De firkantede parentesene tilsvarer testkommandoen. Men du kan overføre en hvilken som helst kommando som et argument (så lenge kommandoen gir noe verdi).

      Hilsen sa

    Hei, hvordan utfører jeg et script.sh med en bruker X i skriptet jeg oppretter en bruker Y, og at brukeren Y fortsetter å utføre scriptet.sh

    Kan dette gjøres ??

      kuktos sa

    Veldig interessant, takk!

      Francisco sa

    Takk for bidraget, jeg har hatt en time på å forstå det xD, men jeg forsto det !!!!.

      Eloy sa

    Manuset er greit. Aritmetisk kan det også gjøres som ($? == 0) hvis det er lik null, er det ikke på nettverket, ellers er det i nettverket. Og hvis vi fortsatt vil gjøre det litt mer interaktivt, kan vi si:
    echo -n Angi IP:
    les ip
    ping -c 1 $ ip

      Dario sa

    Hei, jeg er veldig ny på dette, jeg prøver å lage et billettnummer (alfanumerisk) gjennom en lesing, og jeg vil at hvis det som er angitt har riktig format (ABC-123456), utfører du en "x" -kommando og jeg vet ikke hvordan jeg skal gjøre det, kan du hjelpe meg?

    ekko "Enter ticket"
    lese-p-billett

    hvis $ ticket = "ingen idé (format ABC-123456"); deretter cp file.txt $ billett; ellers ekko "feil format, prøv igjen"; les -p; fi.

    Klart det er forferdelig og de ler haha, men som jeg bare begynner med dette.

    Fortell meg hvis jeg forklarer meg dårlig, og jeg prøver å gjøre det bedre.

    Klem alle sammen.

      Umberto Y sa

    Utmerket forklaring, hilsener

      penn sa

    Jeg er litt i tvil med if, else og andre.
    Jeg vil ha et skript for å sjekke at en fil eksisterer (en av loggene) og hvis ikke, for å lage den og senere skrive til den. Men hvis det finnes, vil jeg at du bare skriver til det.

    Det jeg har er:

    dato = `dato -R`
    #Jeg testet variabel dato, som ikke er oppdatert mellom starten av en
    #prosess og slutter, noen ganger kan det gå en time og riktig tid kommer ikke ut.

    if [-f /home/user/logs/test.log];
    deretter
    trykk på /home/usuario/logs/test.log
    ellers
    echo "$-dato: Oppdatert" >> /home/user/logs/test.log
    ekko «————————————————» >> /home/user/logs/test.log
    fi

    I teorien burde det være greit, men realiteten er at den ikke oppdateres hvis den refererte filen allerede eksisterer

         penn sa

      beklager, jeg så at den ikke ble sendt og den har doblet seg