Bashas: sąlygos (jei-tada-dar)

Sveiki

Šį kartą aš jums parodysiu, kaip sukurti scenarijų su sąlyga Bash, kuris išverstas yra:

Jei X dalykas, kurį norite atlikti, yra įvykdytas, atliekamas Y veiksmas, jei jis nėra įvykdytas, atliekamas kitas veiksmas.

Paprastas paaiškinimas ne 😀

Kelias minutes galvojau apie pavyzdį, kurį galėčiau naudoti šioje pamokoje, man kilo tokia dilema / problema / situacija:

Mes esame savo įmonės tinkle ir norime sužinoti, ar X kompiuteris yra prijungtas prie tinklo. Tam mes darome a scenarijus ką jis padarys zvimbimas link to kompiuterio ir jei jis yra tinkle (tai yra, jei jis grąžina zvimbimas) mums pasakys, kad TAIP, jis yra tinkle, kitaip (tai yra, jis nėra tinkle) jis mums pasakys, kad jis nėra tinkle.

Kai tai bus padaryta, dabar paaiškinsiu, kaip važiuoti su sąlygomis conditions

Štai kodas:

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

Nesijaudinkite, aš jums tai paaiškinsiu išsamiai 😉

zvimbimas yra komanda, kurią naudosime, ir ji mums pasakys, ar tas kompiuteris yra tinkle. Norėdami pasakyti, kurį kompiuterį norime patikrinti, ar jis yra tinkle, ar ne, turime pasikeisti IP ADRESAS akivaizdu, kad norime patikrinti kompiuterio IP adresą.

Kaip matote, aš įdėjau «-c 1 m«, Kuris mums reikalingas. Kai mes pinguojame kompiuterį, šis veiksmas nenutrūksta (pingas), kol nepaspauskite savęs [Ctrl] + [C], todėl įdėti «-c 1 m»Mes jums liepiame atlikti tik vieną patikrinimą (tik vieną bandymą atlikti„ ping “), bet ne daugiau. Tai leis akimirksniu sustoti, tai yra ... jis patikrins, ar kompiuteris yra tinkle tik vieną kartą.

Jei turite abejonių dėl to, neskauda ... jie taip sako ir aš mielai jums tai dar kartą paaiškinsiu 😉

Dabar ateina ciklas, nes tai, ką aš ką tik paaiškinau, yra ne kas kita, kaip įprasta komanda / veiksmas 😀

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

Kad suprastumėte tai, paaiškinsiu itin svarbią Basho detalę 🙂

Labiausiai išmanantys dalykai galėtų mane įvardyti kaip neteisingą ar panašiai, bet, aš, rašau tai naujokams ar mažiau ekspertams, jei tik jie tai supranta

Būna, kad kaip ir Bash tai kažkas panašaus 0 y 1, tai yra, arba tu gyvas, arba miręs, kai vykdoma komanda ar veiksmas: Arba gerai įvykdyta Jokiu problemu (1), Or buvo keletas problema arba klaida (0).

Vykdome X veiksmą ar komandą, o tai, ką padarėme, galėjo būti atlikta gerai arba blogai, gali būti, kad įvyko klaida, ar ne, ir čia yra detalė 😉

Jei tai, ką mes siunčiame daryti (šiuo atveju: ping -c 1 IP adresas) nepadarė klaidos ir tai buvo padaryta gerai, todėl ji grąžins vertę: 1 . Priešingu atveju, ir jei veiksmas (ty pingas) nebuvo sėkmingas, jis grąžins vertę 0.

 Ir pagaliau tai, ką reiškia aukščiau pateiktas kodas, yra toks:

Jei tada vertė 0 buvo grąžinta

Rodyti tekstą: «Ne tinkle»

Kitu atveju (ir grąžinkite NE 0, o 1)

Rodyti tekstą: «Jei jis yra tinkle«

Tai, ką aš jums ką tik paaiškinau, ateityje tarnaus daugeliui dalykų, nes tikrai naudinga pasakyti, kad jei X veiksmas davė klaidą, atlikite Y veiksmą ir jei X veiksmas nesuteikė klaida, tegul Z veiksmas.

Žinau, kad kai kurie gali šiek tiek supainioti, todėl bandžiau tai paaiškinti keliais skirtingais būdais, stengdamasis, kad visi vienaip ar kitaip suprastų. Jei kas nors abejoja, praneškite man.

Dabar sukurkime scenarijų 😀

Turime atlikti šios mokymo programos veiksmus: Bashas: Kaip sukurti vykdomąjį scenarijų

Tada nukopijuokime šį kodą į tą failą (scenarijus.sh), o pabaigoje sakykime «išeiti»(Be kabučių):

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

Tai turėtų atrodyti taip (nepamirškite, kad turite pakeisti IP-ADDRESS į norimą IP):

Čia galite pamatyti vykdomą scenarijų:

% CODE1%

Kaip matote, galų gale jis mums sako «Taip, jis yra tinkle»🙂

Čia svarbu tai, kad jie iš tikrųjų supranta tai apie sąlygas, todėl palieku jums kitą kodą, kad paaiškintumėte dar kartą, bet kitu požiūriu.

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

Ką tai reiškia, paprasta, aš palieku paaiškinimą eilutėje po eilutės:

1-oji eilutė: Tai, ką parašysime, bus kintamojo vertė «tekstas»(Be kabučių).

2 eilutė: Patikrinkite, ar kintamojo turinys (ką mes ką tik parašėme) yra 3.

3-oji eilutė: Būties atveju 3, jis mums parodys tekstą «Ištaisyti»(Be kabučių).

4-oji eilutė: Kitu atveju (tai yra tuo atveju, jei mes neparašėme 3).

5-oji eilutė: Tai parodys mums tekstą «Neteisinga»(Be kabučių).

6-oji eilutė: Būklės pabaiga.

Kaip jie sugebėjo suvokti, jei mes sakome praleisti ir tada tarp dvigubų kabučių («) tekstą, tai sukels tą tekstą terminale. Tai yra, jei mes pateikiame:

echo "esto es una prueba"

Tai mums parodys tekstą terminale: čia testas

Bet grįždamas prie šio antrojo pavyzdžio, aš jums parodysiu šio antrojo scenarijaus naudingumą (ir vykdymą) su kažkuo LABAI paprastu 😀 ... tipišku «kiek yra 1 + 2?«

Aš palieku jums viso scenarijaus kodą:

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

Štai kaip scenarijus veikia:

% CODE2%

Ir gerai ... nieko daugiau pridėti.

Tai yra kažkas elementaraus, paprasto taip, bet vis tiek bandžiau tai paaiškinti kuo geriau, nes ne visi turi programuotojo sielą, ir daug kartų turime kurti tokius scenarijus (ar panašius), bet kokiu atveju aš tikiuosi, kad šis straipsnis jums bus naudingas 🙂

Prašome palikti bet kokių abejonių, klausimų, skundų ar pasiūlymų, palikite čia, aš mielai jums atsakysiu, taigi, mes visi sužinome šiek tiek daugiau 😀

saludos


26 komentarai, palikite savo

Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.

  1.   Džhalsas sakė

    Jūs esate profesionalas !!! * arba *

    1.    KZKG ^ Gaara sakė

      Ne dėl nieko 😀
      Jei tai jums tarnavo ir yra įdomu, aš patenkinta 😉

      Sveikinimai drauge

  2.   tinkamas sakė

    @ KZKG ^ Gaara,
    kalbant apie bash programavimą, man kyla klausimas:
    Koks skirtumas tarp tokio kintamojo paskelbimo kaip VAR = labas ir tokio paskelbimo VAR = $ {VAR:-labas}?

    Aš paaiškinu:
    http://pastebin.com/a3cfWXeD

    sveikinimai 😉

    1.    KZKG ^ Gaara sakė

      Sveiki
      Na, aš visai nesu bash ekspertas ... Tiesą sakant, aš neįsivaizduoju LOL !!
      Kai aš skelbiu kintamuosius, jis yra toks:
      : ${OPTFOLDER:="/opt/"}

      Bet kadangi aš tai dariau visada, aš nežinau, koks skirtumas gali būti sąžiningas 🙁

  3.   tinkamas sakė

    @ KZKG ^ Gaara
    Na, aš uždaviau klausimą, nes tiesa yra ta, kad aš taip pat nežinojau, aš paprastai rašau „SlackBuilds“ ir tiesa ta, kad šiuose scenarijuose gausu kintamųjų, deklaruotų kaip VAR1. Greita „Google“ paieška padėjo man išsiaiškinti šį klausimą, dalinuosi su visais, kad visi galėtume išmokti:

    scenarijus:
    http://pastebin.com/faAQb35w

    Paaiškinimas:
    Deklaruojant formos kintamuosius VAR = $ {VAR: -default_value} reiškia, kad kintamasis VAR reikšmę default_value ims tik tada, jei reikšmė yra nulinė arba jos nėra.

    Praktinis pavyzdys:
    Vykdant scenarijų prašoma įvesti reikšmę, kuri bus saugoma kintamajame VAR, jei kažkas įvedama, tai parodys, kas buvo įvesta. Jei nieko neįvedame ir paspaudžiame „Enter“, skelbiame, kad kintamasis VAR yra nulinis, todėl jis rodo default_value.

    Sveikinimai.

    1.    KZKG ^ Gaara sakė

      HAHA aš to nežinojau 😀
      Gerai, labai ačiū draugei ... tai ir turėjau omenyje straipsnio pabaigoje, neketinu kažko mokyti ir tiek, žinau, kad čia visada sužinosiu ką nors naujo 😀

      Dar kartą sveikinimai ir padėkos.

      1.    tinkamas sakė

        tu teisus, čia išmoksi kelių dalykų.

        linkėjimai ir gražios šventės !! 😀

  4.   Lukas Matiasas sakė

    Puikus ir puikiai paaiškintas +1, laikas, kurio jums prireiks ...
    bet aš verta pastangų 😉

    1.    KZKG ^ Gaara sakė

      Aš iš tikrųjų parašiau 80% tik per vieną dieną, man užtruko tiek laiko, kol jį paskelbiau vien todėl, kad internetas man to neleido.
      Ačiū už jūsų komentarą 😉

  5.   Hugo sakė

    Kitas būdas tai padaryti yra DNS naudojimas, nes kartais tinkluose yra užblokuotas ICMP protokolas:

    (pagrindinis kompiuteris -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Prisijungta prie tinklo"

    Taip pat pastebėsite, kad šiame pavyzdyje grąžinamosios vertės patikrinimas yra netiesioginis 😉

    1.    KZKG ^ Gaara sakė

      Jūs, kaip visada draugas, su patarimais, kurių aš nepažįstu visiškai HAHAHA.
      Ačiū, komentaras vertinamas ir hehe ... dar vienas naujas dalykas, kurį mokausi 😀

  6.   Datuksas sakė

    Ačiū

    ????

  7.   Leper_Ivan sakė

    Nors nuo šios temos paskelbimo praėjo kelios dienos, ji man labai pasitarnavo, dabar, kai sukūriau scenarijų bash .. Ačiū Gaara ..

  8.   Edgaras navarro sakė

    Dėkojame už pagalbą, kad man viską paaiškinote.

    Tiesiog paklausimas, kaip man tai padaryti, kad kai vienas kompiuteris nustoja pinguoti automatiškai, kitas pakeičia IP. Aš turiu tai.

    pakeisti IP
    #! / bin / bash
    ping -c 10 192.168.1.50 #, jei jis nepuola automatiškai
    ifconfig eth0 192.168.1.50 „netmask“ 255.255.255.0 transliacija 192.168.1.0
    ifconfig eth0 žemyn
    ifconfig eth0 up

  9.   Abraomas sakė

    nes lyginant su klaustuku jei naudojate klaustuką? koks skirtumas tarp dedant? bet kuris kitas laiškas

    1.    KZKG ^ Gaara sakė

      $? reiškia „ankstesnę išvestį arba išvestį“, tai yra, jei ankstesnės komandos rezultatas ... ...

      1.    Andrew sakė

        Yra dar vienas būdas pasiekti tą patį rezultatą, tiesiogiai perduodant komandą ping kaip argumentą, jei:

        jei ping -c 1 IP adresas; tada
        aidas "Taip, jis yra tinkle"
        kitas
        aidas „Ne tinkle“
        fi

        Atsitinka taip: jei įvertinama komandos, kurią perduodate kaip argumentą, grąžinimo vertė, jei ji grąžina 0, tai tiesa, visa kita yra klaidinga. Laužtiniai skliaustai yra lygiaverčiai bandymo komandai. Bet jūs galite perduoti bet kurią komandą kaip argumentą (jei komanda grąžina tam tikrą vertę).

  10.   saludos sakė

    Sveiki, kaip aš galiu vykdyti scenarijų.sh su vartotoju X scenarijuje, kuriame sukūriau vartotoją Y, o tas vartotojas Y toliau vykdo scenarijų.sh

    Ar tai galima padaryti ??

  11.   kuktos sakė

    Labai įdomu, ačiū!

  12.   Franciskas sakė

    Ačiū už indėlį, aš jau valandą laiko jį supratau xD, bet aš jį supratau !!!!

  13.   eloy sakė

    Scenarijus yra puikus. Aritmetiniu požiūriu tai taip pat būtų galima padaryti kaip ($? == 0), jei ji lygi nuliui, jos nėra tinkle, kitaip ji yra tinkle. Ir jei mes vis tiek norime padaryti jį šiek tiek interaktyvesnį, galime pasakyti:
    echo -n Įveskite IP:
    skaityti ip
    ping -c 1 $ ip

  14.   Dario sakė

    Sveiki, man tai labai nauja, bandau padaryti bilieto numerį (raidinį ir skaitmeninį) skaitydamas ir noriu, kad jei įvestas būtų teisingo formato (ABC-123456), įvykdykite komandą „x“ ir aš nežinote, kaip tai padaryti, gal galėtumėte man padėti?

    aidas „Įveskite bilietą“
    skaityti -p bilietą

    jei $ bilietas = "nėra idėjos (formatas ABC-123456"); tada cp file.txt $ bilietas; kitaip aidi „netinkamas formatas, bandykite dar kartą“; skaityti -p; fi.

    Aišku, kad tai siaubinga, ir jie juokiasi haha, bet, kaip sakiau, aš tik pradedu nuo to.

    Jei blogai paaiškinu, pasakykite man ir bandau padaryti geriau.

    Apkabink visus.

  15.   Umberto Y sakė

    Puikus paaiškinimas, sveikinimai

  16.   judrus sakė

    Šiek tiek abejoju dėl if, else ir kitų.
    Noriu, kad scenarijus patikrintų, ar failas yra (vienas iš žurnalų), o jei ne, jį sukurti ir vėliau į jį įrašyti. Bet jei jis egzistuoja, noriu, kad tiesiog parašytumėte.

    Ką aš turiu:

    data = "data -R".
    #Išbandžiau kintamą datą, kuri neatnaujinama nuo a pradžios
    #procesas ir baigiasi, kartais gali praeiti valanda, o teisingas laikas neišeina.

    if [-f /home/user/logs/test.log];
    tada
    palieskite /home/usuario/logs/test.log
    kitas
    echo "$ data: Atnaujinta" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Teoriškai tai turėtų būti gerai, tačiau realybė yra tokia, kad ji neatnaujinama, jei nurodytas failas jau yra

    1.    judrus sakė

      atsiprašau, pamačiau, kad neišsiųsta ir padvigubėjo