Bash: Warunki (jeśli-to-jeszcze)

Halo

Tym razem pokażę, jak stworzyć skrypt z warunkiem w Bash, co przetłumaczone to:

Jeśli X rzecz, której chcesz, zostanie wykonana, akcja Y zostanie wykonana, jeśli nie zostanie wykonana, zostanie wykonana inna akcja.

Proste wyjaśnienie nr 😀

Teraz, przez kilka minut myślałem o jakimś przykładzie do wykorzystania w tym samouczku, przyszedł mi do głowy następujący dylemat / problem / sytuacja:

Jesteśmy w sieci naszej firmy i chcemy wiedzieć, czy komputer X jest podłączony do sieci. W tym celu tworzymy scenariusz co zrobi świst w kierunku tego komputera i jeśli znajduje się w sieci (to znaczy, jeśli zwraca świst) powie nam, że TAK, jest w sieci, w przeciwnym razie (to znaczy nie ma go w sieci), powie nam, że NIE jest w sieci.

Gdy to zrobisz, teraz wyjaśnię, jak poruszać się cyklicznie z warunkami 🙂

Oto kod:

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

Nie martw się, wyjaśnię ci to szczegółowo 😉

świst to polecenie, którego użyjemy, i powie nam, czy ten komputer jest w sieci. Aby powiedzieć, który komputer chcemy sprawdzić, czy jest w sieci, czy nie, musimy zmienić ADRES IP oczywiście poprzez adres IP komputera, który chcemy sprawdzić.

Jak widać, postawiłem «-c 1«, Co jest nam potrzebne. Kiedy pingujemy komputer, ta akcja nie zatrzymuje się (ping), dopóki sam nie naciśniemy [Ctrl] + [C]więc mówiąc «-c 1»Nakazujemy mu tylko jedną weryfikację (tylko jedną próbę pingowania) i żadnej innej, to spowoduje natychmiastowe zatrzymanie, czyli… sprawdzi, czy komputer jest w sieci tylko raz.

Jeśli macie co do tego wątpliwości, bez bólu ... tak mówią i chętnie im to jeszcze raz wyjaśnię 😉

Teraz cykl, ponieważ to, co właśnie wyjaśniłem, to nic innego jak zwykłe polecenie / czynność 😀

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

Abyś to zrozumiał, wyjaśnię niezwykle ważny szczegół Bash 🙂

Najbardziej znający się na temacie może mnie nazwać błędnym lub czymś w tym rodzaju, ale hej, piszę to dla nowicjuszy lub mniej ekspertów, o ile rozumieją to świetnie 😉

Zdarza się, że jak w Bash to jest jak 0 y 1, to znaczy albo żyjesz, albo nie żyjesz, gdy wykonywane jest polecenie lub czynność: Albo dobrze wykonane Nie ma problemu (1), Lub było trochę problem lub błąd (0).

Wykonujemy akcję lub polecenie X, a to, co zrobiliśmy, mogło być wykonane dobrze lub źle, mogło mieć błąd lub nie, i tutaj jest szczegół 😉

Jeśli co wyślemy do zrobienia (w tym przypadku: ping -c 1 ADRES IP) nie dał błędu i powiodło się, więc zwróci wartość: 1 . W przeciwnym razie, jeśli akcja (czyli ping) nie zakończyła się sukcesem, zwróci wartość 0.

 I wreszcie, co oznacza powyższy kod, to:

Jeśli wtedy zwrócono wartość 0

Wyświetl tekst: «Nie w sieci»

W przeciwnym razie (i zwróć NIE 0, ale 1)

Wyświetl tekst: «Jeśli jest w sieci«

To, co właśnie wam wyjaśniłem, posłuży nam w przyszłości do wielu rzeczy, ponieważ naprawdę przydatne jest móc powiedzieć, że jeśli akcja X dała błąd, wykonaj akcję Y, a jeśli akcja X nie dała błąd, niech Z działa.

Wiem, że niektórzy mogą się trochę zdezorientować, więc próbowałem to wyjaśnić na kilka różnych sposobów, starając się, aby wszyscy zrozumieli to w taki czy inny sposób. Jeśli ktoś ma wątpliwości, daj mi znać.

Teraz zróbmy nasz skrypt 😀

Musimy postępować zgodnie z instrukcjami w tym samouczku: Bash: Jak zrobić skrypt wykonywalny

Następnie skopiujmy następujący kod do tego pliku (skrypt.sh), a na koniec powiedzmy «wyjście"(Bez cudzysłowów):

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

Powinien wyglądać tak (pamiętaj, że musisz zmienić ADRES IP na żądany):

Tutaj możesz zobaczyć uruchomiony skrypt:

% CODE1%

 

Jak widać, w końcu mówi nam: «Tak, jest w sieci»🙂

Ważną rzeczą jest to, że faktycznie rozumieją to na temat warunków, więc zostawiam wam kolejny kod, aby to jeszcze raz wyjaśnić, ale z innego punktu widzenia.

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

Co to znaczy jest proste, zostawiam wyjaśnienie wiersz po wierszu:

Pierwsza linia: To, co napiszemy, będzie wartością zmiennej «tekst"(Bez cudzysłowów).

2. linia: Sprawdź, czy zawartość zmiennej (co właśnie napisaliśmy) jest 3.

Pierwsza linia: W przypadku istnienia 3, pokaże nam tekst «Popraw"(Bez cudzysłowów).

4. wiersz: W przeciwnym razie (to znaczy na wypadek, gdybyśmy nie napisali 3).

5. wiersz: Pokaże nam tekst «Błędny"(Bez cudzysłowów).

6. wiersz: Koniec warunku.

Jak byli w stanie zrozumieć, jeśli umieścimy przegapić a następnie między cudzysłowami («) tekst, spowoduje to wyświetlenie tego tekstu w terminalu. To znaczy, jeśli umieścimy:

echo "esto es una prueba"

Pokaże nam tekst w terminalu: to jest test

Ale wracając do tego drugiego przykładu, pokażę użyteczność (i wykonanie) tego drugiego skryptu za pomocą czegoś BARDZO prostego 😀… typowego «ile wynosi 1 + 2?«

Zostawiam kod całego skryptu:

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

Oto jak działa skrypt:

% CODE2%

 

I cóż ... nic więcej do dodania.

To jest coś elementarnego, prostego tak, ale mimo wszystko starałem się to jak najlepiej wyjaśnić, bo nie każdy ma duszę programisty i niejednokrotnie musimy robić takie skrypty (lub podobne), w każdym razie ja mam nadzieję, że ten artykuł komuś się przyda 🙂

Wszelkie wątpliwości, pytania, skargi lub sugestie proszę zostawić tutaj, chętnie odpowiem i dzięki temu wszyscy dowiemy się więcej 😀

pozdrowienia


Treść artykułu jest zgodna z naszymi zasadami etyka redakcyjna. Aby zgłosić błąd, kliknij tutaj.

23 komentarzy, zostaw swoje

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Jhals powiedział

    Jesteś profesjonalistą !!! *lub*

    1.    KZKG ^ Gaara powiedział

      Nie za nic 😀
      Jeśli ci służyło i jest ciekawe, to jestem zadowolony 😉

      Witaj przyjacielu

  2.   właściwy powiedział

    @ KZKG ^ Gaara,
    mówiąc o programowaniu w bashu mam pytanie:
    Jaka jest różnica między zadeklarowaniem zmiennej takiej jak ta VAR = hello a zadeklarowaniem jej w ten sposób VAR = $ {VAR: -hello}?

    Wyjaśniam:
    http://pastebin.com/a3cfWXeD

    pozdrowienia 😉

    1.    KZKG ^ Gaara powiedział

      Halo
      Cóż, w ogóle nie jestem ekspertem w bash ... właściwie, nie mam pojęcia LOL !!
      Jak deklaruję zmienne, wygląda to tak:
      : ${OPTFOLDER:="/opt/"}

      Ale ponieważ zawsze tak robiłem, nie wiem, jaka może być różnica, szczerze mówiąc 🙁

  3.   właściwy powiedział

    @ KZKG ^ Gaara
    Cóż, zadałem to pytanie, bo prawda jest taka, że ​​ja też nie wiedziałem, zwykle piszę SlackBuilds i prawda jest taka, że ​​zmienne zadeklarowane jak w VAR1 obfitują w te skrypty. Szybkie wyszukiwanie w Google pomogło mi wyjaśnić to pytanie, udostępniam je wszystkim, abyśmy wszyscy mogli się uczyć:

    Scenariusz:
    http://pastebin.com/faAQb35w

    Wyjaśnienie:
    Zadeklarowanie zmiennych w postaci VAR = $ {VAR: -default_value} oznacza, że ​​zmienna WARIANCJA przyjmie wartość wartość_domyślna wtedy i tylko wtedy, gdy wartość jest zerowa lub nie istnieje.

    Praktyczny przykład:
    Podczas wykonywania skryptu wymagane jest podanie wartości, która ma być przechowywana w zmiennej VAR, jeśli coś zostanie wprowadzone, pokaże to, co zostało wprowadzone. Jeśli nic nie wprowadzimy i naciśniemy enter, deklarujemy zmienną VAR jako null, a więc pokazuje ona wartość_default.

    Pozdrowienia.

    1.    KZKG ^ Gaara powiedział

      HAHA Nie wiedziałem tego 😀
      Ok, bardzo dziękuję przyjacielu ... o to mi chodziło na końcu artykułu, nie zamierzam czegoś uczyć i tyle, wiem, że zawsze się tu czegoś nowego nauczę 😀

      Pozdrawiam i jeszcze raz dziękuję.

      1.    właściwy powiedział

        masz rację, można się tutaj dowiedzieć kilku rzeczy.

        pozdrawiamy i wesołych świąt !! 😀

  4.   Lucas Matias powiedział

    Wspaniałe i świetnie wyjaśnione +1, ile czasu Ci to zajmie ...
    ale jestem wart wysiłku 😉

    1.    KZKG ^ Gaara powiedział

      Właściwie napisałem 80% w zaledwie 1 dzień, tyle czasu zajęło mi opublikowanie tego, ponieważ mój internet mi na to nie pozwalał.
      Dziękuję za komentarz 😉

  5.   Hugo powiedział

    Innym sposobem jest użycie DNS, ponieważ czasami sieci mają zablokowany protokół ICMP:

    (host -ta ADRES IP> / dev / null 2> & 1) && echo „Połączono z siecią”

    Zauważysz również, że w tym przykładzie kontrola zwracanej wartości jest niejawna 😉

    1.    KZKG ^ Gaara powiedział

      Ty jak zawsze przyjaciel, z poradami, których nie znam do końca HAHAHA.
      Dziękuję, komentarz jest mile widziany i hehe ... kolejna nowa rzecz, której się uczę 😀

  6.   Datux powiedział

    dzięki

    🙂

  7.   Leper_Ivan powiedział

    Mimo, że od publikacji tego tematu minęło kilka dni, bardzo mi to służyło, skoro napisałem scenariusz w bashu .. Dzięki Gaara ..

  8.   Edgar navarro powiedział

    Doc. Dziękuję za pomoc, którą wyjaśniłeś mi.

    Tylko zapytanie, jak mam to zrobić, gdy jeden komputer automatycznie przestanie pingować, drugi zmieni adres IP. Mam to.

    zmienić adres IP
    #! / bin / bash
    ping -c 10 192.168.1.50 #, jeśli nie pinguje automatycznie
    ifconfig eth0 192.168.1.50 maska ​​sieci 255.255.255.0 broadcast 192.168.1.0
    ifconfig eth0 wyłączony
    ifconfig eth0 w górę

  9.   Abraham powiedział

    bo w porównaniu z czy użyjesz znaku zapytania? Jaka jest różnica między umieszczeniem? jakikolwiek inny list

    1.    KZKG ^ Gaara powiedział

      $? oznacza „poprzednie wyjście lub wyjście”, czyli w przypadku, gdy wynik poprzedniego polecenia… 🙂

      1.    Andrew powiedział

        Istnieje inny sposób osiągnięcia tego samego wyniku, przekazując polecenie ping bezpośrednio jako argument do if:

        jeśli ping -c 1 ADRES IP; następnie
        echo „Tak, jest w sieci”
        więcej
        echo „Nie w sieci”
        fi

        Dzieje się tak, że jeśli oblicza wartość zwracaną przez polecenie, które przekazujesz jako argument, jeśli zwraca 0, oznacza to, że jest prawdą, wszystko inne jest fałszywe. Nawiasy kwadratowe odpowiadają poleceniu testu. Ale możesz przekazać dowolne polecenie jako argument (o ile polecenie zwróci jakąś wartość).

  10.   pozdrowienia powiedział

    Witam, jak mam wykonać skrypt.sh z użytkownikiem X w skrypcie Tworzę użytkownika Y i ten użytkownik Y kontynuuje wykonywanie skryptu. Sh

    Czy można to zrobić?

  11.   Kukto powiedział

    Bardzo interesujące, dzięki!

  12.   Francisco powiedział

    Dzięki za wkład, miałem godzinę, żeby to zrozumieć xD, ale zrozumiałem !!!!.

  13.   Eloy powiedział

    Scenariusz jest w porządku. Arytmetycznie można to również zrobić jako ($? == 0), jeśli jest równe zero, nie ma go w sieci, w przeciwnym razie jest w sieci. A jeśli nadal chcemy, aby było trochę bardziej interaktywne, możemy powiedzieć:
    echo -n Wprowadź adres IP:
    przeczytaj ip
    ping -c 1 $ ip

  14.   Dario powiedział

    Witam, jestem w tym bardzo nowy, próbuję zrobić numer biletu (alfanumeryczny) poprzez odczyt i chcę, aby jeśli to, co zostało wprowadzone, miało prawidłowy format (ABC-123456), wykonałem polecenie "x" i nie robię nie wiem jak to zrobić, czy możesz mi pomóc?

    echo „Wprowadź bilet”
    czytaj -p bilet

    if $ ticket = "no idea (format ABC-123456"); następnie plik cp.txt $ bilet; w przeciwnym razie echo „zły format, spróbuj ponownie”; przeczytaj -p; fi.

    Jasne, że to okropne i śmieją się haha, ale tak jak powiedziałem, dopiero od tego zaczynam.

    Jeśli źle wyjaśnię, powiedz mi, a postaram się zrobić lepiej.

    Przytul wszystkich.

  15.   Humberto Y powiedział

    Doskonałe wyjaśnienie, pozdrowienia