Bash: Uvjeti (ako-onda-drugo)

Pozdrav 😀

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

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

Jednostavno objašnjenje br

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

Nalazimo se na mreži naše kompanije i želimo znati da li je X računar povezan na mrežu. Za ovo pravimo skripta šta će on učiniti ping prema tom računaru 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.

Nakon što 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, detaljno ću vam objasniti 😉

ping je naredba koju ćemo koristiti i ona će nam reći da li je taj računar na mreži. Da bismo vam rekli koji PC želimo provjeriti je li na mreži ili nije, moramo se promijeniti IP ADRESA očigledno, IP adresa računara koju želimo provjeriti.

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

Ako sumnjate u ovo, nema bolova ... oni to kažu i rado ću vam to ponovo 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 razumiju, onda veliki genijalac

Dešava se da kao u bash 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šeno Nema problema (1), ili bilo ih je problem ili greška (0).

Izvodimo 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 šaljemo da radimo (u ovom slučaju: ping -c 1 IP-ADRESA) nije dao grešku i bio je uspješan, pa će vratiti vrijednost: 1 . Inače, i ako akcija (to jest, ping) nije bila uspješna, vratit će vrijednost 0.

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

Ako je tada vraćena vrijednost 0

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

Inače (i NE 0, ali 1 se vraća)

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 grešku, napravite Y akciju, a u slučaju da X akcija nije dala grešku, pustite Z akciju.

Znam da bi se neki mogli malo zbuniti, pa sam pokušao to 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 neko 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 (script.sh), 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 razumiju ove uvjete, 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, ostavljam objašnjenje red po red:

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

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

3. red: U slučaju da postoji 3, pokazat će nam tekst «Correcto»(Bez navodnika).

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

5. red: Pokazat će nam tekst «Netacno»(Bez navodnika).

6. red: Kraj stanja.

Kako su mogli shvatiti, ako smo stavili odjek a zatim između dvostrukih navodnika («) tekst, to će dovesti do toga da se taj tekst prikaže na 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 s nečim VRLO jednostavnim 😀 ... tipičnim «koliko je 1 + 2?«

Ostavljam 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 radi:

% 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 mnogo 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, molimo vas, ostavite ovdje, rado ću vam odgovoriti, a mi ćemo svi naučiti malo više 😀

Saludos


Sadržaj članka pridržava se naših principa urednička etika. Da biste prijavili grešku, kliknite ovdje.

26 komentara, ostavi svoj

Ostavite komentar

Vaša e-mail adresa neće biti objavljena.

*

*

  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 obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   jhals rekao je

    Vi ste profesionalac !!! * ili *

    1.    KZKG ^ Gaara rekao je

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

      Pozdrav prijatelju

  2.   pravi rekao je

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

    Objašnjavam:
    http://pastebin.com/a3cfWXeD

    pozdrav 😉

    1.    KZKG ^ Gaara rekao je

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

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

  3.   pravi rekao je

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

    Skripta:
    http://pastebin.com/faAQb35w

    Objašnjenje:
    Deklarirajte varijable 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 se da unese vrijednost koja će se pohraniti u VAR varijablu, ako se nešto unese, pokazat će što je uneseno. Ako ne unesemo ništa i pritisnemo enter, proglašavamo varijablu VAR nulom, stoga prikazuje value_default.

    Pozdrav.

    1.    KZKG ^ Gaara rekao je

      HAHA Nisam to znao 😀
      Ok, puno hvala prijatelju ... 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.    pravi rekao je

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

        pozdrav i sretni praznici !! 😀

  4.   Lucas Matthias rekao je

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

    1.    KZKG ^ Gaara rekao je

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

  5.   hugo rekao je

    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 na mrežu"

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

    1.    KZKG ^ Gaara rekao je

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

  6.   Datum rekao je

    hvala

    🙂

  7.   Leper_Ivan rekao je

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

  8.   Edgar navarro rekao je

    Doktore, hvala na pomoći koju ste mi pojasnili.

    Samo upit, kako da to učinim da kada jedan računar automatski prestane pingati, drugi promijeni IP. 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 up

  9.   Abraham rekao je

    jer kada se upoređuje sa if ako koristite upitnik? koja je razlika između stavljanja? bilo koje drugo pismo

    1.    KZKG ^ Gaara rekao je

      $? znači 'prethodni izlaz ili izlaz', to jest, u slučaju da je rezultat prethodne naredbe ... 🙂

      1.    Andrés rekao je

        Postoji još jedan način da se postigne isti rezultat, predajući naredbu ping izravno kao argument ako:

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

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

  10.   Saludos rekao je

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

    Može li se to učiniti ??

  11.   Kuktos rekao je

    Vrlo zanimljivo, hvala!

  12.   Francisco rekao je

    Hvala na doprinosu, imao sam sat vremena da to razumem xD, ali shvatio sam !!!!.

  13.   Eloy rekao je

    Scenarij je u redu. Aritmetički se to može 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:
    pročitajte ip
    ping -c 1 $ ip

  14.   Dario rekao je

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

    odjek "Unesite kartu"
    read -p tiket

    ako je $ ulaznica = "nema ideje (format ABC-123456"); zatim cp file.txt $ ulaznica; else echo "Pogrešan format, pokušaj ponovo"; read -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 da to bude bolje.

    Zagrli sve.

  15.   Umberto Y rekao je

    Izvrsno objašnjenje, pozdrav

  16.   okretan rekao je

    Malo sumnjam u if, else i druge.
    Želim skriptu koja će provjeriti postoji li datoteka (jedan od dnevnika) i ako ne, da je kreiram i kasnije upišem 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 tačno vrijeme ne izađe.

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

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

    1.    okretan rekao je

      izvini, vidio sam da nije poslano i udvostručio se