Bash: Podmínky (if-then-else)

Haló

Tentokrát vám ukážu, jak vytvořit skript s podmínkou v Praštit, což znamená:

Pokud je splněna X věc, kterou chcete, je provedena akce Y, pokud není splněna, provede se další akce.

Jednoduché vysvětlení ne 😀

Nyní jsem několik minut přemýšlel o nějakém příkladu, který bych měl použít v tomto tutoriálu, napadlo mě následující dilema / problém / situace:

Jsme v síti naší společnosti a chceme vědět, jestli je počítač X připojen k síti. Za tímto účelem děláme skript co bude dělat ping k tomuto počítači a pokud je v síti (tj. pokud vrací ping) řekne nám, že ANO, je v síti, jinak (tj. není v síti), řekne nám, že NENÍ v síti.

Jakmile to bude hotové, nyní vysvětlím, jak cyklovat s podmínkami 🙂

Zde je kód:

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

Nebojte se, vysvětlím vám to podrobně 😉

ping je příkaz, který použijeme, a řekne nám, zda je tento počítač v síti. Abychom zjistili, který počítač chceme zkontrolovat, zda je či není v síti, musíme to změnit IP ADRESA zjevně IP adresou počítače, který chceme zkontrolovat.

Jak vidíte, dal jsem «-c 1«, Což je pro nás nezbytné. Když provedeme ping na počítač, tato akce se nezastaví (ping), dokud sami nestiskneme [Ctrl] + [C], takže uvedení «-c 1»Říkáme vám, abyste provedli pouze jedno ověření (pouze jeden pokus o ping) a žádné další, tím se okamžitě zastaví, to znamená ... zkontroluje, zda je počítač v síti pouze jednou.

Pokud o tom máte pochybnosti, žádná bolest ... říkají to a já jim to rád znovu vysvětlím 😉

Nyní přichází cyklus, protože to, co jsem právě vysvětlil, není nic jiného než normální příkaz / akce 😀

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

Aby jste tomu porozuměli, vysvětlím nesmírně důležitý detail Bash 🙂

Nejznalější z tohoto oboru by mě mohli označit za špatného nebo něco takového, ale hej, píšu to pro nováčky nebo méně odborníky, pokud tomu rozumí, pak skvělé great

Stává se, že jako v Praštit je to něco jako 0 y 1, tj. buď jste naživu, nebo jste mrtví, když je proveden příkaz nebo akce: Buď provedeno dobře Žádný problém (1), nějaké byly problém nebo chyba (0).

Provádíme akci nebo příkaz X a to, co jsme udělali, mohlo být provedeno dobře nebo špatně, mohlo to mít chybu nebo ne, a to je detail 😉

Pokud to, co pošleme, udělat (v tomto případě: ping -c 1 IP ADRESA) nedal chybu a byl úspěšný, takže vrátí hodnotu: 1 . Jinak a pokud akce (tj. Ping) nebyla úspěšná, vrátí hodnotu 0.

 A konečně, co výše uvedený kód znamená, je toto:

Pokud byla vrácena hodnota 0

Zobrazit text: «Není v síti»

Jinak (a vrátit NOT 0, ale 1)

Zobrazit text: «Pokud je v síti«

To, co jsem vám právě vysvětlil, nám v budoucnu poslouží k mnoha věcem, protože je opravdu užitečné mít možnost říci, že pokud akce X udělala chybu, proveďte akci Y a v případě, že akce X nedala chybu, nechte akci Z.

Vím, že by se někteří mohli trochu zapojit, a tak jsem se snažil vysvětlit to několika různými způsoby a snažit se, aby to každý pochopil tak či onak. V případě, že někdo zůstane na pochybách, dejte mi vědět.

Nyní vytvořme náš skript 😀

Musíme postupovat podle kroků v tomto tutoriálu: Bash: Jak vytvořit spustitelný skript

Pak zkopírujeme následující kód do tohoto souboru (skript.sh), a na konci řekněme «výstup»(Bez uvozovek):

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

Mělo by to vypadat takto (nezapomeňte, že museli změnit IP-ADDRESS na IP, kterou chtějí):

Zde vidíte spuštěný skript:

% CODE1%

Jak vidíte, nakonec nám říká «Ano, je v síti»🙂

Důležité je zde to, že tomu skutečně rozumějí, takže vám nechám další kód, který to vysvětlí znovu, ale z jiného úhlu pohledu.

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

Co to znamená, je jednoduché, nechávám vysvětlení řádek po řádku:

1. řádek: To, co napíšeme, bude hodnota proměnné «text»(Bez uvozovek).

2. řádek: Zkontrolujte, zda je obsah proměnné (co jsme právě napsali) 3.

3. řádek: V případě bytí 3, zobrazí se nám text «Opravte»(Bez uvozovek).

4. řádek: Jinak (tj. Pokud jsme nenapsali 3).

5. řádek: Ukáže nám text «Nesprávný»(Bez uvozovek).

6. řádek: Konec podmínky.

Jak si dokázali uvědomit, pokud to řekneme minout a pak mezi uvozovkami («) text, způsobí to zobrazení tohoto textu v terminálu. To znamená, pokud dáme:

echo "esto es una prueba"

Ukáže nám text v terminálu: tohle je zkouška

Ale když se vrátím k tomuto druhému příkladu, ukážu vám užitečnost (a provedení) tohoto druhého skriptu něčím VELMI jednoduchým 😀 ... typickým «kolik je 1 + 2?«

Nechávám kód celého skriptu:

#!/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 funguje takto:

% CODE2%

A dobře ... nic dalšího k tomu.

To je něco elementárního, jednoduché ano, ale přesto jsem se to snažil co nejlépe vysvětlit, protože ne každý má duši programátora a mnohokrát musíme vytvořit takové skripty (nebo podobné), každopádně doufám, že vám tento článek bude užitečný někdo 🙂

Jakékoli pochybnosti nebo dotazy, stížnosti nebo návrhy, prosím, nechte zde, rád vám odpovím, a tak se všichni dozvídáme trochu víc 😀

pozdravy


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   jhals řekl

    Jste profesionál !!! *nebo*

    1.    KZKG ^ Gaara řekl

      Ne za nic 😀
      Pokud vám to sloužilo a je to zajímavé, jsem spokojený 😉

      Zdravím přítele

  2.   řádný řekl

    @ KZKG ^ Gaara,
    Když už mluvíme o bash programování, mám otázku:
    Jaký je rozdíl mezi deklarováním proměnné jako je tato VAR = ahoj a deklarováním této proměnné VAR = $ {VAR: -hello}?

    Vysvětluji:
    http://pastebin.com/a3cfWXeD

    pozdravy 😉

    1.    KZKG ^ Gaara řekl

      Haló
      No, nejsem vůbec expert na bash ... vlastně nemám tušení LOL !!
      Jak deklaruji proměnné, je to takto:
      : ${OPTFOLDER:="/opt/"}

      Ale protože jsem to vždycky dělal takhle, nevím, jaký by mohl být rozdíl upřímně 🙁

  3.   řádný řekl

    @ KZKG ^ Gaara
    Položil jsem otázku, protože pravdou je, že ani já jsem to nevěděl, obvykle píšu SlackBuilds a pravdou je, že proměnných deklarovaných jako ve VAR1 je v těchto skriptech spousta. Rychlé vyhledávání google mi pomohlo tuto otázku objasnit, sdílím ji se všemi, abychom se mohli všichni naučit:

    Skript:
    http://pastebin.com/faAQb35w

    Vysvětlení:
    Deklarace proměnných ve tvaru VAR = $ {VAR: -default_value} znamená, že proměnná VAR bude mít hodnotu default_value právě tehdy, pokud má hodnotu null nebo neexistuje.

    Praktický příklad:
    Při provádění skriptu je požadováno zadání hodnoty, která má být uložena do proměnné VAR, pokud je něco zadáno, ukáže, co bylo zadáno. Pokud nic nezadáme a stiskneme klávesu Enter, deklarujeme proměnnou VAR jako null, proto ukazuje value_default.

    Zdravím.

    1.    KZKG ^ Gaara řekl

      HAHA, to jsem nevěděl 😀
      Dobře, děkuji moc příteli ... to jsem měl na mysli na konci článku, nemám v úmyslu něco učit a to je vše, vím, že se zde vždy naučím něco nového 😀

      Zdravím a ještě jednou děkuji.

      1.    řádný řekl

        Máte pravdu, člověk se zde dozví několik věcí.

        pozdravy a šťastné svátky !! 😀

  4.   Lucas Matthias řekl

    Úžasné a skvěle vysvětlené +1, čas, který vám zabere ...
    ale za tu námahu stojím 😉

    1.    KZKG ^ Gaara řekl

      Vlastně jsem napsal 80% za pouhý 1 den, jeho zveřejnění mi trvalo tak dlouho jen proto, že mi to internet nedovolil.
      Děkujeme za váš komentář 😉

  5.   Hugo řekl

    Další způsob, jak to udělat, je použití DNS, protože někdy mají sítě zablokovaný protokol ICMP:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Připojeno k síti"

    Také si všimnete, že v tomto příkladu je kontrola návratové hodnoty implicitní 😉

    1.    KZKG ^ Gaara řekl

      Vy jako vždy přítel, s tipy, které úplně neznám HAHAHA.
      Děkuji, komentář je oceněn a hehe ... další nová věc, kterou se naučím 😀

  6.   datum řekl

    díky

    ????

  7.   Leper_Ivan řekl

    I když od vydání tohoto tématu uplynulo několik dní, hodně mi to posloužilo, když jsem nyní vytvořil scénář v bash .. Díky Gaara ..

  8.   Edgar navarro řekl

    Doc. Děkuji za pomoc, kterou jste mi objasnili.

    Jen dotaz, jak to mám udělat, že když jeden počítač přestane pingovat automaticky, druhý změní IP. Mám tohle.

    změnit IP
    #! / bin / bash
    ping -c 10 192.168.1.50 # pokud nepinguje automaticky
    ifconfig eth0 192.168.1.50 maska ​​sítě 255.255.255.0 vysílání 192.168.1.0
    ifconfig eth0 dolů
    ifconfig eth0 nahoru

  9.   Abraham řekl

    protože při srovnání s pokud používáte otazník? jaký je rozdíl mezi uvedením? jakýkoli jiný dopis

    1.    KZKG ^ Gaara řekl

      $? znamená „předchozí výstup“, tj. v případě, že je výsledkem předchozího příkazu ... 🙂

      1.    Andrew řekl

        Existuje jiný způsob, jak dosáhnout stejného výsledku, předat příkaz ping přímo jako argument, pokud:

        pokud ping -c 1 IP ADRESA; pak
        echo "Ano, je to na internetu"
        jiný
        echo "Není v síti"
        fi

        Co se stane, je to, že pokud se vyhodnotí návratová hodnota příkazu, který předáte jako argument, pokud vrátí 0, je to pravda, všechno ostatní je nepravdivé. Hranaté závorky jsou ekvivalentní příkazu test. Jakýkoli příkaz však můžete předat jako argument (pokud příkaz vrátí nějakou hodnotu).

  10.   pozdravy řekl

    Dobrý den, jak provedu script.sh s uživatelem X ve skriptu, vytvořím uživatele Y a tento uživatel Y pokračuje ve spouštění script.sh

    Lze to udělat ??

  11.   kuktos řekl

    Velmi zajímavé, díky!

  12.   Francisco řekl

    Díky za příspěvek, byl jsem hodinu, abych to pochopil xD, ale pochopil jsem to !!!!.

  13.   Eloy řekl

    Skript je v pořádku. Aritmeticky by to mohlo být také provedeno jako ($? == 0), pokud je rovno nule, není v síti, jinak je v síti. A pokud to chceme ještě trochu udělat interaktivnější, můžeme říci:
    echo -n Zadejte IP:
    číst ip
    ping -c 1 $ ip

  14.   Dario řekl

    Dobrý den, jsem v tom velmi nový, snažím se vytvořit číslo lístku (alfanumerické) prostřednictvím čtení a chci, aby pokud zadané slovo má správný formát (ABC-123456), provedlo příkaz "x" a já nevím, jak to udělat, mohl byste mi pomoci?

    echo "Zadejte lístek"
    číst -p lístek

    if $ ticket = "no idea (formát ABC-123456"); pak cp file.txt $ ticket; else echo "Chybný formát, zkuste to znovu"; read -p; fi.

    Jistě, je to hrozné a smějí se, haha, ale jak jsem řekl, s tím teprve začínám.

    Pokud vysvětlím špatně, řekněte mi to a snažím se dělat lépe.

    Obejměte každého.

  15.   Umberto Y řekl

    Skvělé vysvětlení, pozdravy

  16.   agilní řekl

    Trochu pochybuji s if, else a dalšími.
    Chci skript, který zkontroluje, zda soubor existuje (jeden z protokolů), a pokud ne, aby jej vytvořil a později do něj zapsal. Ale pokud existuje, chci, abys mu napsal.

    Co mám je:

    datum = `datum -R`
    #Testoval jsem proměnné datum, které se mezi začátkem a
    #process and ends, někdy může uplynout hodina a nevyjde správný čas.

    if [-f /home/user/logs/test.log];
    pak
    dotkněte se /home/usuario/logs/test.log
    jiný
    echo "$ datum: Aktualizováno" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Teoreticky by to mělo být v pořádku, ale realita je taková, že se neaktualizuje, pokud již odkazovaný soubor existuje

    1.    agilní řekl

      omlouvám se, viděl jsem, že nebylo odesláno a zdvojnásobilo se