Bash: Uvjeti (ako-onda-drugo)

Bok

Ovaj put ću vam pokazati kako napraviti skriptu sa uvjetom u Tresnuti, što je prevedeno:

Ako je X stvar koju želite ostvarena, izvršava se Y akcija, ako se ne postigne, poduzima se druga radnja.

Jednostavno objašnjenje br

Sad sam nekoliko minuta razmišljao o nekom primjeru koji bih koristio u ovom vodiču, pao mi je na pamet sljedeća dilema / problem / situacija:

Nalazimo se na mreži naše tvrtke i želimo znati je li X računalo povezano s mrežom. Za to izrađujemo rukopis što će učiniti ping prema tom računalu i ako je na mreži (to jest, ako vrati ping) će nam reći da DA, nalazi se na mreži, inače (to jest, nije na mreži) reći će nam da NIJE na mreži.

Kad se to učini, sada ću objasniti kako se vozi s uvjetima 🙂

Evo koda:

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

Ne brinite, objasnit ću vam ovo detaljno 😉

ping je naredba koju ćemo koristiti i ona će nam reći je li to računalo na mreži. Da bismo znali koje računalo želimo provjeriti nalazi li se na mreži ili ne, moramo se promijeniti IP ADRESA očito IP adresom računala koje želimo provjeriti.

Kao što vidite, stavio sam «-c 1«, Što nam je neophodno. Kad pingamo računalo, ova radnja ne prestaje (ping) dok se ne pritisnemo [Ctrl] + [C], pa stavljajući «-c 1»Kažemo mu da izvrši samo jednu provjeru (samo jedan pokušaj pinga) i nijednu drugu, to će ga odmah zaustaviti, odnosno ... provjerit će je li računalo na mreži samo jednom.

Ako sumnjate u ovo, nema boli ... oni to kažu i ja ću im opet objasniti 😉

Sada dolazi ciklus, jer ono što sam upravo objasnio nije ništa drugo nego normalna naredba / radnja 😀

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

Da biste to razumjeli, objasnit ću vam izuzetno važan detalj Basha 🙂

Najupućeniji u toj temi mogli bi me označiti kao pogrešnog ili slično, ali hej, ovo pišem za početnike ili manje stručnjake, sve dok oni to sjajno razumiju

Dogodi se da kao u Tresnuti to je nešto poput 0 y 1, to jest, ili ste živi ili ste mrtvi, kada se izvrši naredba ili radnja: Ili dobro izvršena Nema problema (1) bilo ih je problem ili pogreška (0).

Izvršavamo X radnju ili zapovijed, a ono što smo učinili moglo je biti izvedeno dobro ili loše, možda je došlo do pogreške ili ne, a ovdje je detalj 😉

Ako ono što pošaljemo učiniti (u ovom slučaju: ping -c 1 IP-ADRESA) nije dao pogrešku i bio je uspješan, pa će vratiti vrijednost: 1 . Inače, i ako radnja (odnosno ping) nije bila uspješna, vratit će vrijednost 0.

 I na kraju, što znači gornji kod:

Ako je tada vraćena vrijednost 0

Prikaži tekst: «Nije na mreži»

Inače (i vratite NE 0, već 1)

Prikaži tekst: «Ako je u mreži«

Ovo što sam vam upravo objasnio, poslužit će nam u budućnosti za mnoge stvari, jer je zaista korisno moći reći da ako je X akcija dala pogrešku, učinite Y akciju, a u slučaju da X akcija nije dala pogreška, a zatim učinite Z akciju.

Znam da bi se neki mogli malo zbuniti, pa sam to pokušao objasniti na nekoliko različitih načina, pokušavajući učiniti da svi to shvate na ovaj ili onaj način. U slučaju da netko ostane u nedoumici, javite mi.

Sada, napravimo našu skriptu 😀

Moramo slijediti korake u ovom vodiču: Bash: Kako napraviti izvršnu skriptu

Onda kopirajmo sljedeći kod u tu datoteku (skripta.š), a na kraju recimo «izlaz»(Bez navodnika):

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

To bi trebalo izgledati ovako (imajte na umu da ste sigurno promijenili IP-ADRESU u IP koji želite):

Ovdje možete vidjeti pokrenutu skriptu:

% CODE1%

Kao što vidite, na kraju nam kaže «Da, u mreži je»🙂

Ovdje je najvažnije da oni zapravo to razumiju u vezi s uvjetima, pa vam ostavljam još jedan kôd da to ponovo objasnite, ali s druge točke gledišta.

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

Što ovo znači jednostavno, obrazloženje ostavljam red po red:

1. redak: Ono što napišemo, to će biti vrijednost varijable «tekst»(Bez navodnika).

2. redak: Provjerite je li sadržaj varijable (ono što smo upravo napisali) 3.

3. redak: U slučaju da je 3, pokazat će nam tekst «pravo»(Bez navodnika).

4. redak: Inače (to jest, u slučaju da nismo napisali 3).

5. redak: Pokazat će nam tekst «Netočno»(Bez navodnika).

6. redak: Kraj stanja.

Kao što su uspjeli shvatiti, ako stavimo odjek a zatim između dvostrukih navodnika («) tekst, to će uzrokovati prikaz tog teksta u terminalu. Odnosno, ako stavimo:

echo "esto es una prueba"

Pokazat će nam tekst u terminalu: ovo je test

No, vraćajući se na ovaj drugi primjer, pokazat ću vam korisnost (i izvršenje) ove druge skripte nečim VRLO jednostavnim 😀 ... tipičnim «koliko je 1 + 2?«

Ostavljam vam kod kompletne skripte:

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

Evo kako skripta djeluje:

% CODE2%

I dobro ... ništa više za dodati.

Ovo je nešto elementarno, jednostavno da, ali ipak sam pokušao to objasniti što je bolje moguće, jer nemaju svi dušu programera, i puno puta moramo napraviti skripte poput ovih (ili sličnih), u svakom slučaju ja nadam se da će vam ovaj članak netko biti koristan 🙂

Svaka sumnja ili pitanje, žalba ili prijedlog, ostavite ovdje, rado ću vam odgovoriti, a mi ćemo svi naučiti malo više 😀

pozdravi


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   Džali dijo

    Vi ste profesionalac !!! *ili*

    1.    KZKG ^ Gaara dijo

      Ma ne za ništa 😀
      Ako vam je poslužilo i zanimljivo je, zadovoljan sam 😉

      Pozdrav prijatelju

  2.   odgovarajuće dijo

    @ KZKG ^ Gaara,
    kad smo već kod bash programiranja, imam pitanje:
    Koja je razlika između deklariranja varijable poput ove VAR = hello i deklariranja ovako VAR = $ {VAR: -hello}?

    Ja objašnjavam:
    http://pastebin.com/a3cfWXeD

    pozdrav 😉

    1.    KZKG ^ Gaara dijo

      Bok
      Pa, ja uopće nisam stručnjak za bash ... zapravo, nemam pojma LOL !!
      Dok deklariram varijable, to je ovako:
      : ${OPTFOLDER:="/opt/"}

      Ali budući da sam to uvijek radio ovako, ne znam koja bi razlika mogla biti iskreno 🙁

  3.   odgovarajuće dijo

    @ KZKG ^ Gaara
    Pa, postavio sam pitanje jer istina je da ni ja nisam znao, obično pišem SlackBuilds, a istina je da varijabli deklarirane kao u VAR1 obiluju tim skriptama. Brzo google pretraživanje pomoglo mi je razjasniti ovo pitanje, dijelim ga sa svima kako bismo svi mogli naučiti:

    skripta:
    http://pastebin.com/faAQb35w

    Obrazloženje:
    Deklariranje varijabli oblika VAR = $ {VAR: -default_value} znači da će varijabla VAR uzeti vrijednost default_value ako i samo ako je vrijednost null ili ne postoji.

    Praktični primjer:
    prilikom izvršavanja skripte traži da unese vrijednost koja će se pohraniti u varijablu VAR, ako se nešto unese, pokazat će što je uneseno. Ako ništa ne unesemo i pritisnemo enter, proglašavamo varijablu VAR nulom, stoga pokazuje value_default.

    Pozdrav.

    1.    KZKG ^ Gaara dijo

      HAHA to nisam znao 😀
      Ok, hvala ti puno prijatelju ... na to sam mislio na kraju članka, ne namjeravam nešto podučavati i to je to, znam da ću ovdje uvijek naučiti nešto novo 😀

      Još jednom pozdrav i hvala.

      1.    odgovarajuće dijo

        u pravu si, ovdje se nauči nekoliko stvari.

        pozdrav i sretni praznici !! 😀

  4.   Lucas Matija dijo

    Sjajno i izvrsno objašnjeno +1, vrijeme koje će vam trebati ...
    ali vrijedan sam truda 😉

    1.    KZKG ^ Gaara dijo

      Zapravo sam napisao 80% u samo jedan dan, trebalo mi je toliko vremena da ga objavim samo zato što mi Internet nije dopustio.
      Hvala na komentaru 😉

  5.   Hugo dijo

    Drugi način za to je korištenje DNS-a, jer ponekad mreže imaju blokiran ICMP protokol:

    (host -ta IP-ADRESA> / dev / null 2> & 1) && echo "Povezano s mrežom"

    Također ćete primijetiti da je u ovom primjeru provjera povratne vrijednosti implicitna 😉

    1.    KZKG ^ Gaara dijo

      Ti kao i uvijek prijatelj, sa savjetima koje ne znam u potpunosti HAHAHA.
      Hvala, komentar je cijenjen i hehe ... još jedna nova stvar koju naučim 😀

  6.   Datum dijo

    hvala

    ????

  7.   Leper_Ivan dijo

    Iako je prošlo nekoliko dana od objavljivanja ove teme, poslužilo mi je puno, sad kad sam napravio skriptu na bashu .. Hvala Gaara ..

  8.   Edgar navarro dijo

    Doc. Hvala na pomoći što si mi pojasnio stvari.

    Samo upit, kako da to učinim da, kada jedno računalo automatski prestane pingirati, drugo promijeni IP. Ja imam ovo.

    za promjenu IP-a
    #! / bin / bash
    ping -c 10 192.168.1.50 # Ako se ne pinguje automatski
    ifconfig eth0 192.168.1.50 mrežna maska ​​255.255.255.0 emitirana 192.168.1.0
    ifconfig eth0 dolje
    ifconfig eth0 gore

  9.   Abraham dijo

    jer kad se uspoređuje s if ako koristite upitnik? koja je razlika između stavljanja? bilo koje drugo slovo

    1.    KZKG ^ Gaara dijo

      $? znači "prethodni izlaz ili izlaz", odnosno u slučaju da je rezultat prethodne naredbe ... 🙂

      1.    Andrija dijo

        Postoji još jedan način za postizanje istog rezultata, prosljeđivanje naredbe ping izravno kao argument ako:

        ako ping -c 1 IP-ADRESA; zatim
        odjek "Da, na mreži je"
        drugo
        odjek "Nije na mreži"
        fi

        Ono što se događa je da ako procijeni povratnu vrijednost naredbe koju proslijedite kao argument, ako vrati 0, istina je, bilo što drugo je lažno. Uglate zagrade jednake su test naredbi. Ali bilo koju naredbu možete proslijediti kao argument (sve dok naredba vraća neku vrijednost).

  10.   pozdravi dijo

    Pozdrav, kako izvršiti script.sh s korisnikom X u skripti kreiram korisnika Y, a taj korisnik Y nastavlja izvršavati script.sh

    Može li se to ??

  11.   Kuktoš dijo

    Vrlo zanimljivo, hvala!

  12.   Francisco dijo

    Hvala na doprinosu, imam sat vremena da to shvatim xD, ali razumio sam !!!!.

  13.   Eloy dijo

    Scenarij je u redu. Aritmetički bi se to moglo učiniti i kao ($? == 0) ako je jednako nuli i nije na mreži, inače je na mreži. A ako to ipak želimo učiniti malo interaktivnijim, možemo reći:
    echo -n Unesite IP:
    čitati ip
    ping -c 1 $ ip

  14.   Dario dijo

    Pozdrav, vrlo sam nov u ovome, pokušavam napraviti broj ulaznice (alfanumerički) kroz očitanje i želim da ako ono što se unese ima ispravan format (ABC-123456) izvršim naredbu "x" i ne razumijem ne znam kako to učiniti, možete li mi pomoći?

    odjek "Unesite kartu"
    čitaj -p ulaznica

    if $ ticket = "nema ideje (format ABC-123456"); zatim cp file.txt $ ulaznica; inače odjekuje "pogrešan format, pokušaj ponovno"; čitati -p; fi.

    Naravno da je užasno i smiju se haha, ali kao što rekoh, tek počinjem s ovim.

    Ako loše objasnim, recite mi i trudim se biti bolji.

    Zagrli sve.

  15.   Umberto Y dijo

    Izvrsno objašnjenje, pozdrav

  16.   okretan dijo

    Malo sumnjam u if, else i druge.
    Želim skriptu za provjeru postojanja datoteke (jedan od dnevnika), a ako ne, za stvaranje i kasnije pisanje u nju. Ali ako postoji, želim da mu samo napišete.

    Ono što imam je:

    datum = `datum -R`
    #Testirao sam varijabilni datum, koji se ne ažurira između početka a
    #proces i završi, ponekad može proći sat vremena, a točno vrijeme ne izađe.

    ako [-f /home/user/logs/test.log];
    tada
    dodirnite /home/usuario/logs/test.log
    drugo
    echo "$ datum: ažurirano" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    U teoriji bi trebalo biti u redu, ali stvarnost je da se ne ažurira ako referencirana datoteka već postoji

    1.    okretan dijo

      oprosti, vidio sam da nije poslan i udvostručio se