Bash: tingimused (kui-siis-veel)

Tere

Seekord näitan teile, kuidas skripti teha tingimusega sisse lööma, mis on tõlgitud:

Kui X asi, mida soovite, on tehtud, tehakse Y-toiming, kui seda ei tehta, siis tehakse teine ​​toiming.

Lihtne seletus ei 😀

Nüüd olen mõned minutid mõelnud mõne näite kohta, mida selles õpetuses kasutada, tekkis mul järgmine dilemma / probleem / olukord:

Oleme oma ettevõtte võrgus ja tahame teada, kas X-arvuti on võrguga ühendatud. Selleks teeme a käsikiri mida ta teeb ping selle arvuti suunas ja kui see on võrgus (st kui see tagastab ping) ütleb meile, et JAH, see on võrgus, vastasel juhul (see tähendab, et see pole võrgus) ütleb ta meile, et see EI ole võrgus.

Kui see on tehtud, siis nüüd selgitan, kuidas tingimustega tsükkel 🙂

Siin on kood:

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

Ärge muretsege, ma selgitan teile seda üksikasjalikult 😉

ping on käsk, mida me kasutame, ja see annab meile teada, kas see arvuti on võrgus. Et öelda teile, millist arvutit me tahame kontrollida, kas see on võrgus või mitte, peame muutma IP-AADRESS ilmselgelt selle arvuti IP-aadressi järgi, mida me kontrollida tahame.

Nagu näete, panin ma «-c 1«, Mis on meile vajalik. Kui me arvutit pingime, ei peatu see toiming (ping) enne, kui me ennast vajutame [Ctrl] + [C], nii pannes «-c 1»Me käskime teil teha ainult üks kontroll (ainult üks pingutuskatse) ja mitte ükski teine. See peatab selle koheselt, see tähendab ... see kontrollib, kas arvuti on võrgus ainult üks kord.

Kui teil on selles kahtlusi, pole valu ... nad ütlevad nii ja ma selgitan seda hea meelega teile uuesti 😉

Nüüd tuleb tsükkel, sest see, mida ma just seletasin, pole midagi muud kui tavaline käsk / toiming 😀

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

Et sellest aru saaksite, selgitan Bashi extremely äärmiselt olulist detaili 🙂

Teema kõige teadlikumad võivad mind valeks vms nimetada, aga hei, ma kirjutan selle algajatele või vähem asjatundjatele, kui nad sellest aru saavad, siis suurepärane geniaal

See juhtub, et nagu sisse sisse lööma see on midagi sellist 0 y 1, see tähendab, et kas olete elus või olete surnud, kui käsk või toiming täidetakse: hästi täidetud Pole probleemi (1) neid oli probleem või viga (0).

Me täidame X-i toimingut või käsku ja see, mida me tegime, võib olla läbi viidud hästi või halvasti, sellel võib olla viga või mitte, ja see on koht, kus detail on 😉

Kui me saadame seda teha (antud juhul: ping -c 1 IP-AADRESS) ei andnud viga ja õnnestus, seega tagastab väärtuse: 1 . Vastasel juhul ja kui toiming (st ping) ei õnnestunud, tagastab see väärtuse 0.

 Ja lõpuks, mida ülaltoodud kood tähendab, on see:

Kui väärtus 0 tagastati siis

Kuva tekst: «Pole võrgus»

Vastasel juhul (ja tagastage EI 0, vaid 1)

Kuva tekst: «Kui see on võrgus«

See, mida ma just teile selgitasin, teenib meid tulevikus paljudes asjades, sest on tõesti kasulik öelda, et kui X-i toiming andis vea, siis tehke Y-toimingut ja juhul, kui X-i tegevus pole viga andnud, siis tehke Z-i.

Ma tean, et mõned võivad veidi segadusse sattuda, nii et olen püüdnud seda seletada mitmel erineval viisil, püüdes kõiki nii või teisiti mõista. Juhul kui keegi jääb kahtlema, andke mulle teada.

Nüüd koostame oma skripti 😀

Peame järgima selle õpetuse juhiseid: Bash: kuidas teha käivitatav skript

Seejärel kopeerime selle faili järgmise koodi (script.sh) ja ütleme lõpus «väljumiseks»(Jutumärkideta):

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

See peaks välja nägema selline (pidage meeles, et nad peavad kindlasti muutnud IP-AADRESS soovitud IP-ks):

Siin näete töötavat skripti:

% CODE1%

Nagu näete, ütleb ta lõpuks meile «Jah, see on võrgus»🙂

Oluline on siin see, et nad mõistavad seda tingimustest tegelikult, nii et jätan teile uue koodi, et seda uuesti selgitada, kuid teisest vaatenurgast.

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

Mida see tähendab, on lihtne, jätan selgituse rea kaupa:

1. rida: Mida me kirjutame, see on muutuja väärtus «tekst»(Jutumärkideta).

2. rida: Kontrollige, kas muutuja (mida me just kirjutasime) sisu on 3.

3. rida: Olemise korral 3, see näitab meile teksti «Õige»(Jutumärkideta).

4. rida: Vastasel juhul (st juhul, kui me pole kirjutanud 3).

5. rida: See näitab meile teksti «Vale»(Jutumärkideta).

6. rida: Seisundi lõpp.

Nagu nad on suutnud aru saada, kui me ütleme miss ja seejärel topelt jutumärkide vahel («) tekst, kuvatakse see tekst terminalis. See tähendab, et kui me paneme:

echo "esto es una prueba"

See näitab meile terminalis olevat teksti: see on test

Kuid naastes selle teise näite juurde, näitan teile selle teise skripti kasulikkust (ja teostust) midagi VÄGA lihtsat 😀 ... tüüpiline «kui palju on 1 + 2?«

Jätan teile kogu skripti koodi:

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

Skript töötab nii:

% CODE2%

Ja noh ... rohkem pole midagi lisada.

See on midagi elementaarset, lihtne jah, kuid siiski olen püüdnud seda võimalikult hästi seletada, sest kõigil pole programmeerija hinge ja mitu korda peame tegema selliseid skripte (või sarnaseid), igal juhul loodan, et see artikkel on teile kasulik keegi 🙂

Kui teil on mingeid kahtlusi või küsimusi, kaebusi või ettepanekuid, jätke see siia, vastan teile hea meelega ja seega õpime kõik natuke rohkem

seoses


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   jhals DIJO

    Sa oled proff !!! * või *

    1.    KZKG ^ Gaara DIJO

      Ei mingit asja 😀
      Kui see teid teenis ja see on huvitav, olen rahul 😉

      Tervitused sõber

  2.   korralik DIJO

    @ KZKG ^ Gaara,
    rääkides bashi programmeerimisest, on mul küsimus:
    Mis vahe on sellise muutuja deklareerimisel VAR = tere ja deklareerimisel VAR = $ {VAR: -hello}?

    Ma selgitan:
    http://pastebin.com/a3cfWXeD

    tervitused 😉

    1.    KZKG ^ Gaara DIJO

      Tere
      Noh, ma pole üldse bashi asjatundja ... tegelikult pole mul LOList aimugi !!
      Muutujate deklareerimisel on see järgmine:
      : ${OPTFOLDER:="/opt/"}

      Aga kuna ma tegin seda alati niimoodi, siis ma ei tea, mis erinevus ausalt võiks olla 🙁

  3.   korralik DIJO

    @ KZKG ^ Gaara
    Noh, ma esitasin selle küsimuse, sest tõde on see, et ka mina ei teadnud, kirjutan tavaliselt SlackBuildsi ja tõde on see, et VAR1-s deklareeritud muutujaid on neis skriptides palju. Kiire google'i otsing aitas mul selle küsimuse selgeks teha, jagan seda kõigiga, et saaksime kõik õppida:

    Skript:
    http://pastebin.com/faAQb35w

    Selgitus:
    Vormi VAR = $ {VAR: -default_value} muutujate deklareerimine tähendab, et muutuja VAR võtab väärtuse default_value ainult siis, kui väärtus on null või seda pole olemas.

    Praktiline näide:
    Skripti käivitamisel palutakse sisestada muutuja VAR salvestatav väärtus, kui midagi sisestatakse, näitab see sisestatud. Kui me midagi ei sisesta ja vajutame sisestusklahvi, kuulutame muutuja VAR nulliks, seetõttu näitab see väärtust_default.

    Tervitused.

    1.    KZKG ^ Gaara DIJO

      HAHA ma ei teadnud seda 😀
      Ok, tänan teid väga sõber ... seda ma mõtlesin artikli lõpus, ma ei kavatse midagi õpetada ja see on kõik, ma tean, et ma õpin siin alati midagi uut 😀

      Tervitused ja tänud veel kord.

      1.    korralik DIJO

        sul on õigus, üks õpib siin mitut asja.

        tervitusi ja häid pühi !! 😀

  4.   Lucas Matthias DIJO

    Suurepärane ja suurepäraselt selgitatud +1, aeg, mis teil kulub ...
    aga vaeva väärt 😉

    1.    KZKG ^ Gaara DIJO

      Kirjutasin tegelikult 80% kõigest ühe päevaga, mul kulus selle postitamine nii kaua, kuna mu internet ei lubanud.
      Tänan teid kommentaari eest 😉

  5.   Hugo DIJO

    Teine võimalus seda teha on DNS-i kasutamine, kuna mõnikord on võrkudel ICMP-protokoll blokeeritud:

    (host -ta IP-AADRESS> / dev / null 2> & 1) && kaja "Ühendatud võrguga"

    Samuti märkate, et selles näites on tagastusväärtuse kontroll vaikimisi 😉

    1.    KZKG ^ Gaara DIJO

      Sina nagu alati sõber, näpunäidetega, mida ma HAHAHA täielikult ei tunne.
      Aitäh, kommentaari hinnatakse ja hehe ... veel üks uus asi, mida ma õpin 😀

  6.   Kuupäev DIJO

    tänan

    🙂

  7.   Leper_Ivan DIJO

    Kuigi selle teema avaldamisest on möödas mitu päeva, on see mulle palju teeninud, nüüd, kui tegin skripti bash'is. Aitäh Gaara ..

  8.   Edgar navarro DIJO

    Dok. Aitäh abi eest, mille te mulle asjad selgeks tegite.

    Lihtsalt päring, kuidas ma saan teha nii, et kui üks arvuti lõpetab automaatselt pingimise, muudab teine ​​IP-d. Mul on see.

    IP muutmiseks
    #! / bin / bash
    ping -c 10 192.168.1.50 # Kui see ei pingi automaatselt
    ifconfig eth0 192.168.1.50 netimask 255.255.255.0 eetris 192.168.1.0
    ifconfig eth0 alla
    ifconfig eth0 üles

  9.   Abraham DIJO

    sest kui võrrelda küsimusega, kui kasutate küsimärki? mis vahe on? mis tahes muu kiri

    1.    KZKG ^ Gaara DIJO

      $? tähendab "eelmist väljundit või väljundit", st juhul, kui eelmise käsu tulemus on ... 🙂

      1.    Andrew DIJO

        Sama tulemuse saavutamiseks on veel üks viis, edastades käsu ping otse argumendina, kui:

        kui ping -c 1 IP-AADRESS; siis
        kaja "Jah, see on netis"
        teine
        kaja "Pole võrgus"
        fi

        Mis juhtub, on see, et kui hindate argumendina edastatud käsu tagastusväärtust, kui see tagastab 0, on see tõene, on kõik muu vale. Nurksulgud on samaväärsed testkäsklusega. Kuid võite argumendina edastada mis tahes käsu (kui käsk tagastab mingi väärtuse).

  10.   seoses DIJO

    Tere, kuidas käivitada script.sh kasutaja X-ga skriptis, mille loo kasutaja Y, ja see kasutaja Y jätkab skripti.sh täitmist

    Kas seda saab teha ??

  11.   kuktos DIJO

    Väga huvitav, aitäh!

  12.   Francisco DIJO

    Aitäh panuse eest, mul on olnud tund aega selle mõistmiseks xD, kuid sain sellest aru !!!!.

  13.   eloy DIJO

    Stsenaarium on korras. Aritmeetiliselt võiks seda teha ka kujul ($? == 0), kui see on võrdne nulliga, siis pole seda võrgus, vastasel juhul on see võrgus. Ja kui me ikkagi tahame seda veidi interaktiivsemaks muuta, võime öelda:
    echo -n Sisestage IP:
    loe ip
    ping -c 1 $ ip

  14.   Dario DIJO

    Tere, ma olen selles väga uus. Proovin lugeda kaudu piletinumbrit (tähtnumbrilist) ja soovin, et kui sisestatud failil oleks õige vorming (ABC-123456), täidaks käsk "x" ja ma ei tea, kuidas seda teha, kas saaksite mind aidata?

    kaja "Sisesta pilet"
    loe -p pilet

    kui $ pilet = "pole aimugi (vorming ABC-123456"); siis cp file.txt $ pilet; muidu kaja "vale formaat, proovige uuesti"; loe -p; fi.

    Muidugi on see kohutav ja nad naeravad haha, aga nagu ma ütlesin, et ma alles alustan sellega.

    Kui seletan halvasti, öelge palun ja proovin teha paremini.

    Kallistage kõiki.

  15.   Umberto Y DIJO

    Suurepärane selgitus, tervitused

  16.   vilgas DIJO

    Mul on väike kahtlus if, else ja teiste suhtes.
    Ma tahan, et skript kontrolliks faili olemasolu (üks logidest) ja kui mitte, siis selle loomiseks ja hiljem kirjutamiseks. Aga kui see on olemas, siis ma tahan, et te lihtsalt kirjutaksite sellele.

    See, mis mul on, on:

    kuupäev = "kuupäev -R".
    #Testisin muutuvat kuupäeva, mis ei värskenda mind alguses a
    #protsess ja lõppeb, vahel võib tund mööda minna ja õige aeg ei tule välja.

    if [-f /home/user/logs/test.log];
    SIIS
    puudutage /home/usuario/logs/test.log
    teine
    echo "$ kuupäev: värskendatud" >> /home/user/logs/test.log
    kaja «———————————————-» >> /home/user/logs/test.log
    fi

    Teoreetiliselt peaks see olema korras, kuid tegelikkuses on see, et seda ei värskendata, kui viidatud fail on juba olemas

    1.    vilgas DIJO

      vabandust, vaatasin, et seda ei saadetud ja see on kahekordistunud