Bash: Feltételek (ha-akkor-más)

Helló

Ezúttal megmutatom, hogyan készítsünk egy parancsfeltételt feltételekkel Bashfordítás:

Ha X kívánt dolog megvalósul, akkor Y művelet történik, ha nem teljesül, akkor egy másik műveletet hajt végre.

Egyszerű magyarázat nem 😀

Néhány percig gondoltam néhány példára, amelyet ebben az oktatóanyagban használhatnék, a következő dilemma / probléma / helyzet merült fel bennem:

Cégünk hálózatán vagyunk, és szeretnénk tudni, hogy X számítógép csatlakozik-e a hálózathoz. Ehhez a forgatókönyv mit fog tenni fütyülés a számítógép felé, és ha hálózaton van (vagyis ha visszaadja a fütyülés) azt mondja nekünk, hogy IGEN, a hálózaton van, különben (vagyis nincs a hálózaton) azt fogja mondani, hogy NEM a hálózaton van.

Miután ez megtörtént, most elmagyarázom, hogyan kell ciklust folytatni a feltételekkel

Itt van a kód:

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

Ne aggódj, ezt részletesen elmagyarázom neked 😉

fütyülés az a parancs, amelyet használni fogunk, és megmondja, hogy a számítógép csatlakozik-e a hálózathoz. Meg kell változtatnunk, hogy megtudjuk, melyik számítógépet akarjuk ellenőrizni, hogy a hálózaton van-e vagy sem IP-CÍM nyilvánvalóan az ellenőrizni kívánt számítógép IP-címével.

Amint láthatja, betettem «-c 1«, Ami szükséges nekünk. Amikor pingelünk egy számítógépet, ez a művelet nem áll le (a ping), amíg meg nem nyomjuk magunkat [Ctrl] + [C], szóval «-c 1»Azt mondjuk, hogy csak egy ellenőrzést hajtson végre (csak egy ping-kísérletet), és semmit sem, ezzel azonnal leáll, vagyis ... csak egyszer ellenőrzi, hogy a számítógép csatlakozik-e a hálózathoz.

Ha kétségei vannak ezzel kapcsolatban, nincs fájdalom ... ők ezt mondják, és szívesen elmagyarázom még egyszer 😉

Most jön a ciklus, mert amit most elmagyaráztam, nem más, mint egy normál parancs / művelet 😀

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

Annak érdekében, hogy megértse ezt, elmagyarázom a Bash rendkívül fontos részletét

A témában a legismertebbek tévedésnek vagy ilyesminek minősíthetnek, de hé, ezt kezdőknek vagy kevésbé szakértőknek írom, mindaddig, amíg megértik, akkor remek 😉

Előfordul, hogy mint a Bash valami olyasmi 0 y 1, vagyis vagy élsz, vagy halott vagy, amikor egy parancs vagy művelet végrehajtásra kerül: Bármelyik jól kivégezték Nincs mit (1), A volt néhány probléma vagy hiba (0).

X műveletet vagy parancsot hajtunk végre, és amit tettünk, azt jól vagy rosszul hajtottuk végre, lehet, hogy hibája volt, vagy sem, és itt van a részlet 😉

Ha mit küldünk tenni (ebben az esetben: ping -c 1 IP-CÍM) nem adott hibát, és jól sikerült, így visszaadja az értéket: 1 . Ellenkező esetben, és ha a művelet (vagyis a ping) nem volt sikeres, akkor visszaadja az értéket 0.

 És végül, mit jelent a fenti kód:

Ha a 0 értéket adta vissza, akkor

A következő szöveg megjelenítése: «Nem a hálózaton»

Ellenkező esetben (és adja vissza NEM 0, hanem 1)

A következő szöveg megjelenítése: «Ha hálózatban van«

Ez, amit most elmagyaráztam nektek, sok mindenre szolgál a jövőben, mert nagyon hasznos azt mondani, hogy ha az X művelet hibát adott, akkor végezzen Y műveletet, és abban az esetben, ha az X művelet nem adott hibát, hagyja, hogy Z cselekedjen.

Tudom, hogy egyesek kissé összezavarodhatnak, ezért megpróbáltam többféleképpen elmagyarázni, és igyekeztem mindenkit így vagy úgy megérteni. Abban az esetben, ha bárki kétségbe merülne, tudassa velem.

Most készítsük el a szkriptünket 😀

Kövessük az oktatóanyag lépéseit: Bash: Futtatható parancsfájl készítése

Akkor másoljuk a következő kódot abba a fájlba (script.sh), és mondjuk a végén «kijárat»(Idézőjelek nélkül):

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

Így kell kinéznie (ne felejtsük el, hogy biztosan megváltoztatták az IP-CÍMET a kívánt IP-re):

Itt láthatja a futó szkriptet:

% CODE1%

Mint láthatja, végül azt mondja nekünk «Igen, hálózatban van»🙂

A legfontosabb itt az, hogy valóban megértik ezt a feltételekkel kapcsolatban, ezért hagyok neked egy másik kódot, hogy újra megmagyarázd, de más szempontból.

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

Mit jelent ez egyszerű, soronként hagyom a magyarázatot:

1. sor: Amit írunk, az lesz a változó értéke «szöveg»(Idézőjelek nélkül).

2. sor: Ellenőrizze, hogy a változó tartalma (amit most írtunk) 3.

3. sor: Lét esetén 3, megmutatja nekünk a szöveget «Helyes»(Idézőjelek nélkül).

4. sor: Egyébként (vagyis ha nem írtunk 3-at).

5. sor: Ez megmutatja nekünk a szöveget «Helytelen»(Idézőjelek nélkül).

6. sor: Az állapot vége.

Ahogyan rájöttek, ha fogalmazunk visszhang majd dupla idézőjelek között («) egy szöveget, akkor ez a szöveg megjelenik a terminálon. Vagyis ha ezt tesszük:

echo "esto es una prueba"

Megmutatja a szöveget a terminálon: ez egy teszt

De visszatérve erre a második példára, meg fogom mutatni ennek a második szkriptnek a hasznosságát (és végrehajtását) valami NAGYON egyszerűvel ... a tipikus «mennyi az 1 + 2?«

Otthagyom a teljes szkript kódját:

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

A szkript így működik:

% CODE2%

És hát ... nincs mit hozzáfűzni.

Ez valami elemi, egyszerű igen, de mégis megpróbáltam a lehető legjobban megmagyarázni, mert nem mindenkinek van programozó lelke, és sokszor ilyen (vagy hasonló) szkripteket kell készítenünk, mindenesetre én remélem, hogy ez a cikk hasznos lesz Önnek valakinek 🙂

Ha bármilyen kétsége, kérdése, panasza vagy javaslata lenne, hagyja itt, szívesen válaszolok Önnek, és így mindannyian többet tudunk 😀

Üdvözlet


Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   jhals dijo

    Te profi vagy !!! *vagy*

    1.    KZKG ^ Gaara dijo

      Nah semmiért 😀
      Ha neked szolgált és érdekes, elégedett vagyok 😉

      Üdvözlet barátom

  2.   megfelelő dijo

    @ KZKG ^ Gaara,
    a bash programozásról szólva kérdésem lenne:
    Mi a különbség egy ilyen változó deklarálása között VAR = hello és így deklarálva VAR = $ {VAR: -hello}?

    Elmagyarázom:
    http://pastebin.com/a3cfWXeD

    üdvözlet 😉

    1.    KZKG ^ Gaara dijo

      Helló
      Nos, egyáltalán nem vagyok a bash szakértője ... valójában fogalmam sincs LOL-ról !!
      Amint kijelentem a változókat, ez így van:
      : ${OPTFOLDER:="/opt/"}

      De mivel mindig így tettem, nem tudom mi lehet a különbség őszintén 🙁

  3.   megfelelő dijo

    @ KZKG ^ Gaara
    Nos, feltettem a kérdést, mert az az igazság, hogy én sem tudtam, én általában a SlackBuilds-t írom, és az az igazság, hogy a VAR1-ben deklarált változók bővelkednek ezekben a szkriptekben. Egy gyors google keresés segített tisztázni ezt a kérdést, megosztom mindenkivel, hogy mindannyian megtanulhassuk:

    Forgatókönyv:
    http://pastebin.com/faAQb35w

    Magyarázat:
    A VAR = $ {VAR: -default_value} alakú változók deklarálása azt jelenti, hogy a VAR változó csak akkor veszi az alapértelmezett értéket, ha az érték nulla vagy nem létezik.

    Gyakorlati példa:
    a szkript végrehajtásakor kéri a VAR változóba tárolandó érték megadását, ha valamit beírnak, az megmutatja, hogy mi lett beírva. Ha nem írunk be semmit, és megnyomjuk az Enter billentyűt, akkor a VAR változót nullának nyilvánítjuk, ezért az alapértelmezett értéket mutatja.

    Üdvözlet.

    1.    KZKG ^ Gaara dijo

      HAHA ezt nem tudtam 😀
      Ok, nagyon köszönöm barátom ... ezt értettem a cikk végén, nem szándékozom tanítani valamit, és ennyi, tudom, hogy mindig itt tanulok valami újat 😀

      Üdvözlet és köszönet még egyszer.

      1.    megfelelő dijo

        igazad van, az ember itt több dolgot megtanul.

        üdvözletet és boldog ünnepeket !! 😀

  4.   Lucas Mátyás dijo

    Félelmetes és kiválóan megmagyarázott +1, az az idő, amire neked ...
    de megérem a fáradságot 😉

    1.    KZKG ^ Gaara dijo

      80% -ot valóban 1 nap alatt írtam, ennyi időbe telt, mire csak az internetem nem engedte.
      Köszönöm a megjegyzést 😉

  5.   Hugo dijo

    Ennek másik módja a DNS használata, mivel néha a hálózatok blokkolják az ICMP protokollt:

    (host -ta IP-CÍM> / dev / null 2> & 1) && echo "Csatlakozva a hálózathoz"

    Azt is észreveszi, hogy ebben a példában a visszatérési érték ellenőrzése implicit 😉

    1.    KZKG ^ Gaara dijo

      Te, mint mindig barátod, olyan tippekkel, amiket nem ismerek teljesen HAHAHA.
      Köszönöm, a megjegyzést nagyra értékeljük, és hehe ... még egy új dolog, amit megtanultam 😀

  6.   Dátum dijo

    Köszönöm

    ????

  7.   Leper_Ivan dijo

    Annak ellenére, hogy több nap telt el a téma közzététele óta, nagyon sokat szolgált nekem, most, hogy forgatókönyvet készítettem bash-ban .. Köszönöm Gaara ..

  8.   Edgar navarro dijo

    Doktor köszönöm a segítséget, amit világossá tett a számomra.

    Csak egy kérdés, hogyan tegyem, hogy amikor az egyik számítógép automatikusan leállítja a pingelést, a másik megváltoztatja az IP-címet. Nekem van.

    az IP megváltoztatásához
    #! / bin / bash
    ping -c 10 192.168.1.50 # Ha nem pingel automatikusan
    ifconfig eth0 192.168.1.50 netmaszk 255.255.255.0 broadcast 192.168.1.0
    ifconfig eth0 le
    ifconfig eth0 fel

  9.   Ábrahám dijo

    mert ha összehasonlítja a kérdőjelet? mi a különbség a? bármely más levél

    1.    KZKG ^ Gaara dijo

      $? "előző kimenetet vagy kimenetet" jelent, vagyis abban az esetben, ha az előző parancs eredménye ... 🙂

      1.    Andrew dijo

        Van egy másik módszer ugyanezen eredmény elérésére, a ping parancsot közvetlenül argumentumként továbbítva, ha:

        ha ping -c 1 IP-CÍM; akkor
        visszhang "Igen, a neten van"
        más
        echo "Nincs a hálózaton"
        fi

        Az történik, hogy ha kiértékeli az argumentumként átadott parancs visszatérési értékét, ha 0-t ad vissza, akkor bármi más hamis. A szögletes zárójelek egyenértékűek a tesztparancssal. De bármilyen parancsot átadhat érvként (mindaddig, amíg a parancs visszaad valamilyen értéket).

  10.   Üdvözlet dijo

    Üdvözlet! Hogyan futtathatok egy script.sh-t egy X felhasználóval a szkriptben, létrehozok egy Y felhasználót, és az Y felhasználó folytatja a script.sh futtatását.

    Meg lehet ezt csinálni ??

  11.   kuktos dijo

    Nagyon érdekes, köszönöm!

  12.   Francisco dijo

    Köszönöm a hozzájárulást, egy órája volt, hogy megértsem xD, de megértettem !!!!.

  13.   Eloy dijo

    A forgatókönyv rendben van. Aritmetikailag meg lehet csinálni ($? == 0) néven is, ha nulla egyenlő, akkor nincs a hálózaton, különben a hálózaton van. És ha mégis szeretnénk egy kicsit interaktívabbá tenni, akkor azt mondhatjuk:
    echo -n Adja meg az IP-címet:
    olvasni ip
    ping -c 1 $ ip

  14.   Dario dijo

    Üdvözlet! Nagyon új vagyok ebben. Próbálok jegyet készíteni (alfanumerikus) egy olvasás során, és szeretném, ha a beírt fájl formátuma megfelelő (ABC-123456) végrehajtana egy "x" parancsot, és nem nem tudom, hogyan kell csinálni, tudnál nekem segíteni?

    visszhang "Jegy megadása"
    read -p jegy

    ha $ jegy = "nincs ötlet (formátum: ABC-123456"); majd cp file.txt $ jegy; különben visszhangzik "rossz formátum, próbálkozzon újra"; olvas -p; fi.

    Persze, hogy szörnyű és nevetnek haha, de mint mondtam, csak ezzel kezdem.

    Ha rosszul magyarázom, kérem, mondja meg, és megpróbálok jobbat csinálni.

    Ölelj meg mindenkit.

  15.   Umberto Y dijo

    Kiváló magyarázat, üdvözlet

  16.   agilis dijo

    Kicsit kétségeim vannak az if, else és másokkal kapcsolatban.
    Szeretnék egy szkriptet ellenőrizni, hogy létezik-e egy fájl (a naplók egyike), és ha nem, akkor létrehozza és később írjon bele. De ha létezik, azt szeretném, ha csak írj rá.

    Amim van:

    dátum = `dátum -R`
    #Változó dátumot teszteltem, amely nem frissül a kezdete között
    #folyamat és véget ér, néha eltelhet egy óra és nem jön ki a megfelelő idő.

    if [-f /home/user/logs/test.log];
    akkor
    érintse meg a /home/usuario/logs/test.log elemet
    más
    echo "$ dátum: Frissítve" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Elméletileg rendben kell lennie, de a valóság az, hogy nem frissül, ha a hivatkozott fájl már létezik

    1.    agilis dijo

      sajnálom, láttam, hogy nem küldték el, és megduplázódott