Bash: voorwaardes (as-dan-anders)

Hallo 😀

Hierdie keer sal ek u wys hoe u 'n teks met voorwaarde in kan maak Bash, wat vertaal is:

As X-ding wat u wil, gedoen word, word Y-aksie gedoen, as dit nie gedoen word nie, word 'n ander aksie gedoen.

Eenvoudige verduideliking nee 😀

Nou het ek 'n paar minute gedink aan 'n paar voorbeelde om in hierdie handleiding te gebruik, die volgende dilemma / probleem / situasie het by my opgekom:

Ons is op ons maatskappy se netwerk en ons wil weet of X-rekenaar aan die netwerk gekoppel is. Hiervoor maak ons ​​'n script wat sal hy doen ping in die rigting van daardie rekenaar en as dit op 'n netwerk is (dit wil sê as dit die ping) sal vir ons sê dat JA, dit is op die netwerk, anders (dit wil sê, dit is nie op die netwerk nie), sal dit vir ons sê dat dit NIE op die netwerk is nie.

Sodra dit gedoen is, sal ek nou verduidelik hoe om met toestande cycle te fiets

Hier is die kode:

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

Moenie bekommerd wees nie, ek sal dit aan u verduidelik explain

ping is die opdrag wat ons sal gebruik, en dit sal ons vertel of die rekenaar op die netwerk is. Om te weet watter rekenaar ons wil nagaan of dit op die netwerk is, moet ons verander IP-ADRES deur natuurlik die IP-adres van die rekenaar wat ons wil nagaan.

Soos u kan sien, sit ek «-c 1Wat vir ons nodig is. As ons 'n rekenaar ping, stop hierdie aksie (die ping) totdat ons onsself druk [Ctrl] + [C], so gestel «-c 1»Ons sê u moet net een verifikasie doen (slegs een pingpoging) en geen ander nie; dit sal dadelik stop, dit wil sê ... dit sal kyk of die rekenaar net een keer op die netwerk is.

As u hieroor twyfel, is daar geen pyn nie ... hulle sê dit en ek sal dit graag weer aan u kan verduidelik explain

Nou kom die siklus, want wat ek nou net verduidelik het, is niks anders nie as 'n normale opdrag / aksie 😀

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

Sodat u dit verstaan, sal ek 'n uiters belangrike detail van Bash explain verduidelik

Die kundigste van die onderwerp kan my as verkeerd of iets dergeliks merk, maar hey, ek skryf dit vir die beginners of minder kundiges, solank hulle dit dan goed verstaan ​​😉

Dit gebeur dat soos in Bash dit is iets soos 0 y 1, dit wil sê of jy lewe of dat jy dood is wanneer 'n opdrag of aksie uitgevoer word: óf goed uitgevoer Geen probleem (1), of daar was 'n paar probleem of fout (0).

Ons voer X-optrede of opdrag uit, en wat ons gedoen het, is goed of sleg uitgevoer, dit het dalk 'n fout gehad of nie, en dit is hier waar die detail is 😉

As wat ons stuur om te doen (in hierdie geval: ping -c 1 IP-ADRES) het nie 'n fout gegee nie en was suksesvol, dus sal dit die waarde oplewer: 1 . Andersins, en as die handeling (dit wil sê die ping) nie suksesvol was nie, sal dit waarde teruggee 0.

 En laastens, wat die bogenoemde kode beteken, is dit:

As waarde 0 dan teruggestuur is

Vertoon die teks: «Nie op die netwerk nie»

Anders (en NIE 0 nie, maar 1 word terugbesorg)

Vertoon die teks: «As dit in die netwerk is«

Dit wat ek nou net aan u verduidelik het, sal ons in die toekoms vir baie dinge dien, want dit is baie nuttig om te kan sê dat as X-aksie 'n fout gee, Y-aksie doen, en as X-aksie nie 'n fout gegee het nie, dan Z-aksie.

Ek weet dat sommige dalk 'n bietjie betrokke raak, en daarom het ek dit op verskillende maniere probeer verduidelik en probeer om almal dit op die een of ander manier te laat verstaan. Laat weet my as iemand twyfel.

Kom ons maak nou ons skrif 😀

Ons moet die stappe in hierdie handleiding volg: Bash: Hoe om 'n uitvoerbare skrif te maak

Kom ons kopieer die volgende kode in die lêer (skrif.sh), en laat ons aan die einde sê «verlaat»(Sonder die aanhalings):

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

Dit moet so lyk (onthou dat hulle die IP-ADRES moes verander na die IP wat hulle wil hê):

Hier kan u die lopende script sien:

% KODE1%

 

Soos u kan sien, vertel hy ons uiteindelik «Ja, dit is in die netwerk»🙂

Die belangrikste hier is dat hulle dit regtig verstaan, dus laat ek u 'n ander kode om dit weer te verduidelik, maar vanuit 'n ander oogpunt.

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

Wat dit beteken is eenvoudig, ek laat die verduideliking reël vir reël:

1ste reël: Wat ons skryf, dit is die waarde van die veranderlike «teks»(Sonder die aanhalings).

2de reël: Kyk of die veranderlike (wat ons so pas geskryf het) se inhoud is 3.

3ste reël: In geval van wees 3, dit sal ons die teks wys «Korrigeer»(Sonder die aanhalings).

4de reël: Andersins (dit wil sê as ons nie 3 geskryf het nie).

5de reël: Dit sal ons die teks wys «verkeerde»(Sonder die aanhalings).

6de reël: Einde van die toestand.

Soos hulle kon besef, as ons dit stel mis en dan tussen dubbele aanhalings («) 'n teks, dan sal die teks in die terminale vertoon word. Dit wil sê as ons dit stel:

echo "esto es una prueba"

Dit sal ons die teks in die terminale wys: hierdie is 'n toets

Maar as ek na hierdie tweede voorbeeld terugkeer, sal ek u die nut (en uitvoering) van hierdie tweede script wys met iets BAIE eenvoudig 😀 ... die tipiese «hoeveel is 1 + 2?«

Ek laat die kode van die volledige skrif vir u:

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

Dit is hoe die skrif werk:

% KODE2%

 

En wel ... niks meer om by te voeg nie.

Dit is iets elementêrs, eenvoudig, ja, maar tog het ek probeer om dit so goed as moontlik te verklaar, want nie almal het die siel van 'n programmeerder nie, en ons moet baie keer skrifte soos hierdie (of soortgelyk) maak, in elk geval hoop ek dat hierdie artikel vir u nuttig sal wees iemand 🙂

Enige twyfel of vraag, klagte of voorstel, laat dit hier, ek sal u graag antwoord en sodoende leer ons almal 'n bietjie meer 😀

Groete


Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

26 kommentaar, los joune

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

  1.   jhals dijo

    Jy is 'n pro !!! * of *

    1.    KZKG ^ Gaara dijo

      Niks verniet 😀
      As dit u gedien het en dit interessant is, is ek tevrede 😉

      Groete vriend

  2.   behoorlike dijo

    @ KZKG ^ Gaara,
    praat van bash programmering het ek 'n vraag:
    Wat is die verskil tussen die verklaring van 'n veranderlike soos hierdie VAR = hallo en verklaar dit soos hierdie VAR = $ {VAR: -hello}?

    Ek verduidelik:
    http://pastebin.com/a3cfWXeD

    groete 😉

    1.    KZKG ^ Gaara dijo

      Hallo 😀
      Wel, ek is glad nie 'n kundige in bash nie ... eintlik het ek geen idee LOL nie !!
      Terwyl ek die veranderlikes verklaar, is dit soos volg:
      : ${OPTFOLDER:="/opt/"}

      Maar omdat ek dit altyd so gedoen het, weet ek nie wat die verskil eerlik kan wees nie 🙁

  3.   behoorlike dijo

    @ KZKG ^ Gaara
    Wel, ek het die vraag gevra, want die waarheid is dat ek ook nie geweet het nie, ek skryf gewoonlik SlackBuilds en die waarheid is dat veranderlikes wat in VAR1 verklaar word in hierdie skrifte volop is. 'N Vinnige google-soektog het my gehelp om hierdie vraag duidelik te maak, ek deel dit met almal sodat ons almal kan leer:

    script:
    http://pastebin.com/faAQb35w

    verduideliking:
    Om veranderlikes van die vorm VAR = $ {VAR: -default_value} te verklaar, beteken dat die veranderlike VAR die waarde default_value sal neem as en slegs as die waarde nul is of nie bestaan ​​nie.

    Praktiese voorbeeld:
    By die uitvoering van die script word gevra om 'n waarde in te voer wat in die VAR-veranderlike gestoor moet word. As iets ingevoer word, sal dit wys wat ingevoer is. As ons niks invoer nie en druk op enter, verklaar ons die veranderlike VAR as nul, daarom wys dit waarde_default.

    Groete.

    1.    KZKG ^ Gaara dijo

      HAHA ek het dit nie geweet nie 😀
      Ok, baie dankie vriend ... dit is wat ek aan die einde van die artikel bedoel, ek is nie van plan om iets te leer nie en dit is dit, ek weet dat ek altyd iets nuuts hier sal leer learn

      Groete en nogmaals dankie.

      1.    behoorlike dijo

        jy het gelyk, mens leer hier verskillende dinge.

        groete en gelukkige vakansie !! 😀

  4.   Lucas Matthias dijo

    Baie goed en uitstekend verduidelik +1, die tyd wat dit jou sou neem ...
    maar ek is die moeite werd 😉

    1.    KZKG ^ Gaara dijo

      Ek het eintlik 80% binne net 1 dag geskryf, dit het my so lank geneem om dit te plaas, net omdat my internet my nie toegelaat het nie.
      Dankie vir u opmerking 😉

  5.   Hugo dijo

    Nog 'n manier om dit te doen, is die gebruik van DNS, aangesien ICMP-protokolle soms in netwerke geblokkeer word:

    (gasheer -ta IP-ADRES> / dev / null 2> & 1) && eggo "Gekoppel aan netwerk"

    U sal ook opmerk dat die retourwaarde-tjek in hierdie voorbeeld implisiet is 😉

    1.    KZKG ^ Gaara dijo

      Jy soos altyd vriend, met wenke wat ek nie heeltemal ken nie HAHAHA.
      Dankie, die opmerking word waardeer en hehe ... nog 'n nuwe ding wat ek leer 😀

  6.   Datum dijo

    Dankie

    🙂

  7.   Melaatse_Ivan dijo

    Al het 'n paar dae verloop sedert die publikasie van hierdie onderwerp, het dit my baie gedien, noudat ek 'n teks in bash gemaak het .. Dankie Gaara ..

  8.   Edgar navarro dijo

    Dok. Dankie vir die hulp wat u dinge vir my duidelik gemaak het.

    Net 'n vraag, hoe kan ek dit doen wanneer die een rekenaar outomaties ophou ping, die ander IP verander. Ek het dit.

    om die IP te verander
    #! / bin / bash
    ping -c 10 192.168.1.50 # as dit nie outomaties ping nie
    ifconfig eth0 192.168.1.50 netmasker 255.255.255.0 uitgesaai 192.168.1.0
    ifconfig eth0 af
    ifconfig eth0 op

  9.   Abraham dijo

    want as jy die vraagteken gebruik as jy dit vergelyk? watter verskil is daar tussen om die? enige ander brief

    1.    KZKG ^ Gaara dijo

      $? beteken 'die vorige uitvoer', dit wil sê in die geval van die resultaat van die vorige opdrag ... 🙂

      1.    Andrew dijo

        Daar is 'n ander manier om dieselfde resultaat te bereik deur die ping-opdrag direk deur te gee as 'n argument as:

        as ping -c 1 IP-ADRES; dan
        eggo "Ja, dit is op die net"
        anders
        eggo "Nie op die netwerk nie"
        fi

        Wat gebeur, is dat as die retourwaarde van die opdrag wat u as argument evalueer, beoordeel word as dit 0 is, is dit waar, is niks anders vals nie. Die hakies is gelykstaande aan die toetsopdrag. Maar u kan enige opdrag as argument deurgee (solank die opdrag 'n waarde oplewer).

  10.   Groete dijo

    Hallo, hoe voer ek 'n script.sh uit met 'n gebruiker X in die script skep ek 'n gebruiker Y, en die gebruiker Y gaan voort met die uitvoering van die script.sh

    Kan dit gedoen word ??

  11.   kuktos dijo

    Baie interessant, dankie!

  12.   Francisco dijo

    Dankie vir die bydrae, ek was 'n uur lank besig om dit te verstaan ​​xD, maar ek het dit verstaan ​​!!!!.

  13.   Eloy dijo

    Die skrif is goed. Rekenkundig kan dit ook gedoen word as ($? == 0) as dit gelyk is aan nul, is dit nie op die netwerk nie, anders is dit op die netwerk. En as ons dit nog 'n bietjie meer interaktief wil maak, kan ons sê:
    echo -n Voer die IP in:
    lees ip
    ping -c 1 $ ip

  14.   Dario dijo

    Hallo, ek is baie nuut hieroor, ek probeer om 'n kaartjie nommer (alfanumeriek) te maak deur middel van 'n lees en ek wil hê dat as wat ingevoer word die regte formaat het (ABC-123456) 'n "x" opdrag uitvoer en ek weet nie hoe om dit te doen nie, kan u my help?

    eggo "Voer kaartjie in"
    lees -p kaartjie

    as $ ticket = "geen idee (ABC-123456-formaat"); dan cp file.txt $ kaartjie; anders eggo "Verkeerde formaat, probeer weer"; lees -p; fi.

    Seker dit is verskriklik en hulle lag haha, maar soos ek gesê het, begin ek net hiermee.

    Vertel my as ek sleg verduidelik, en ek probeer beter doen.

    Omhels almal.

  15.   Umberto Y dijo

    Uitstekende verduideliking, groete

  16.   rats dijo

    Ek het 'n bietjie twyfel met if, else en ander.
    Ek wil 'n skrip hê om seker te maak dat 'n lêer bestaan ​​(een van logs) en indien nie, om dit te skep en later daaraan te skryf. Maar as dit bestaan, wil ek hê jy moet net daaraan skryf.

    Wat ek het is:

    datum = `datum -R`
    #Ek het veranderlike datum getoets, wat nie opgedateer word tussen die begin van 'n
    #verwerk en eindig, soms kan 'n uur verbygaan en die regte tyd kom nie uit nie.

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

    In teorie behoort dit goed te wees, maar die realiteit is dat dit nie opgedateer word as die verwysde lêer reeds bestaan ​​nie

    1.    rats dijo

      jammer, ek het gesien dat dit nie gestuur is nie en dit het verdubbel