Bash: Kushtet (nëse-atëherë-tjetër)

Përshëndetje

Këtë herë do t'ju tregoj se si të bëni një skenar me kusht në Përplas, i cili përkthehet është:

Nëse bëhet X gjë që dëshironi, bëhet veprimi Y, nëse nuk bëhet atëherë bëhet një veprim tjetër.

Shpjegim i thjeshtë jo

Tani, kam menduar për disa minuta për disa shembuj për t'u përdorur në këtë manual, më ndodhi dilema / problemi / situata vijuese:

Ne jemi në rrjetin e kompanisë sonë dhe duam të dimë nëse kompjuteri X është i lidhur me rrjetin. Për këtë ne bëjmë një dorëshkrim çfarë do të bëjë ai ping drejt atij kompjuteri, dhe nëse është në një rrjet (domethënë, nëse e kthen ping) do të na tregojë se PO, është në rrjet, përndryshe (dmth. nuk është në rrjet) do të na tregojë se NUK është në rrjet.

Pasi të jetë bërë kjo, tani unë do të shpjegoj se si të ciklit me kushte

Këtu është kodi:

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

Mos u shqetëso, unë do të ta shpjegoj këtë në detaje

ping është komanda që do të përdorim dhe do të na tregojë nëse ai PC është në rrjet. Për t'ju thënë se cilin PC duam të kontrollojmë nëse është në rrjet apo jo, ne duhet të ndryshojmë ADRESA IP padyshim nga adresa IP e PC-së që duam të kontrollojmë.

Siç mund ta shihni, unë vendosi «-c 1«, Cila është e nevojshme për ne. Kur ping një kompjuter, ky veprim nuk ndalet (ping) derisa të shtypim veten [Ctrl] + [C], pra vendosja «-c 1»Ne i themi që të bëjë vetëm një verifikim (vetëm një përpjekje për ping) dhe asnjë tjetër, kjo do ta bëjë atë të ndalet menjëherë, dmth ... do të kontrollojë nëse kompjuteri është në rrjet vetëm një herë.

Nëse keni dyshime për këtë, pa dhimbje ... ata e thonë atë dhe unë do t'ua shpjegoj përsëri atyre again

Tani vjen cikli, sepse ajo që sapo shpjegova nuk është asgjë më shumë sesa një komandë / veprim normal ...

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

Kështu që ta kuptoni këtë, unë do të shpjegoj një detaj jashtëzakonisht të rëndësishëm të Bash

Më të diturit e kësaj teme mund të më konsiderojnë si të gabuar ose diçka të tillë, por hej, unë e shkruaj këtë për fillestarët ose më pak ekspertë, për sa kohë që ata e kuptojnë atë atëherë shumë mirë

Ndodh që si në Përplas eshte dicka si 0 y 1, domethënë, ose jeni gjallë ose jeni i vdekur, kur ekzekutohet një komandë ose veprim: Ose ekzekutuar mirë Nuk ka problem (1), ose kishte ca problem ose gabim (0).

Ne kryejmë veprim ose komandë X, dhe ajo që kemi bërë mund të jetë kryer mirë ose keq, mund të ketë pasur një gabim ose jo, dhe këtu është detaji is

Nëse ajo që dërgojmë të bëjmë (në këtë rast: ping -c 1 IP-ADRESA) nuk dha një gabim dhe ishte i suksesshëm, kështu që do të kthejë vlerën: 1 . Përndryshe, dhe nëse veprimi (domethënë ping) nuk ishte i suksesshëm, ai do të kthejë vlerën 0.

 Dhe së fundmi, ajo që do të thotë kodi i mësipërm është kjo:

Nëse vlera 0 kthehej atëherë

Shfaq tekstin: «Jo në rrjet»

Përndryshe (dhe ktheni JO 0, por 1)

Shfaq tekstin: «Nëse është në rrjet«

Kjo që sapo ju kam shpjeguar, do të na shërbejë në të ardhmen për shumë gjëra, sepse është vërtet e dobishme të thuash që nëse veprimi X dha një gabim, bëj veprimin Y, dhe në rast se veprimi X nuk ka dhënë një gabim, atëherë bëj veprimin Z.

Unë e di që disa mund të ngatërrohen disi, kështu që jam përpjekur ta shpjegoj atë në disa mënyra të ndryshme, duke u përpjekur t'i bëj të gjithë ta kuptojnë atë në një mënyrë apo në një tjetër. Në rast se ndokush lihet në dyshim, më tregoni.

Tani, le ta bëjmë skenarin tonë

Ne duhet të ndjekim hapat në këtë manual: Bash: Si të krijoni një skenar të ekzekutueshëm

Atëherë le të kopjojmë kodin vijues në atë skedar (skenari.sh), dhe në fund le të themi «dalje»(Pa thonjëza):

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

Duhet të duket kështu (mos harroni se ata duhet të kenë ndryshuar IP-ADRESN në IP që ata dëshirojnë):

Këtu mund të shihni skenarin e ekzekutimit:

% KODI1%

Siç mund ta shihni, në fund ai na thotë «Po është në rrjet»

Gjëja e rëndësishme këtu është që ata në të vërtetë e kuptojnë këtë nga kushtet, kështu që unë ju lë një kod tjetër për ta shpjeguar përsëri, por nga një këndvështrim tjetër.

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

Çfarë do të thotë kjo është e thjeshtë, unë e lë shpjegimin rresht pas rreshti:

Rreshti i parë: Ajo që shkruajmë, kjo do të jetë vlera e ndryshores «texting»(Pa thonjëza).

Rreshti i 2-të: Kontrolloni nëse është përmbajtja e ndryshores (ajo që sapo shkruam) 3.

Rreshti i parë: Në rast të qenies 3, do të na tregojë tekstin «Korrigjoni»(Pa thonjëza).

Rreshti i 4-të: Përndryshe (domethënë, në rast se nuk kemi shkruar 3).

Rreshti i 5-të: Do të na tregojë tekstin «i pasaktë»(Pa thonjëza).

Rreshti i 6-të: Fundi i gjendjes.

Siç kanë qenë në gjendje ta kuptojnë, nëse vendosim humbas dhe pastaj midis kuotave të dyfishta («) një tekst, kjo do të bëjë që ai tekst të shfaqet në terminal. Kjo është, nëse vendosim:

echo "esto es una prueba"

Do të na tregojë tekstin në terminal: ky eshte nje test

Por duke iu kthyer këtij shembulli të dytë, unë do t'ju tregoj dobinë (dhe ekzekutimin) e këtij skenari të dytë me diçka SHUM të thjeshtë - tipike «sa kushton 1 + 2?«

Unë lë kodin e skenarit të plotë:

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

Ja se si funksionon skenari:

% KODI2%

Dhe mirë ... asgjë më shumë për të shtuar.

Kjo është diçka elementare, e thjeshtë po, por prapë jam përpjekur ta shpjegoj sa më mirë, sepse jo të gjithë kanë shpirtin e një programuesi, dhe shumë herë na duhet të bëjmë skenare si këto (ose të ngjashme), në çdo rast shpresoj që ky artikull të jetë i dobishëm për ju dikush

Ndonjë dyshim apo pyetje, ankesë ose sugjerim ju lutem, lini këtu, unë me kënaqësi do t'ju përgjigjem dhe kështu, të gjithë mësojmë pak më shumë

të fala


26 komente, lini tuajën

Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   Xhahalli dijo

    Ju jeni një pro !!! * ose *

    1.    KZKG ^ Gaara dijo

      Nah për asgjë
      Nëse ju ka shërbyer dhe është interesante, unë jam i kënaqur

      Pershendetje shoku

  2.   i duhur dijo

    @ KZKG ^ Gaara,
    duke folur për programimin bash kam një pyetje:
    Cili është ndryshimi midis deklarimit të një variabli si ky VAR = hello dhe deklarimit të tij si ky VAR = $ {VAR: -hello}?

    Unë shpjegoj:
    http://pastebin.com/a3cfWXeD

    pershendetje

    1.    KZKG ^ Gaara dijo

      Përshëndetje
      Epo, unë nuk jam aspak ekspert në bash ... në të vërtetë, nuk kam ide LOL !!
      Ndërsa deklaroj ndryshoret është kështu:
      : ${OPTFOLDER:="/opt/"}

      Por, sepse gjithmonë e bëja kështu, nuk e di cili ndryshim mund të jetë sinqerisht

  3.   i duhur dijo

    @ KZKG ^ Gaara
    Epo bëra pyetjen sepse e vërteta është se as unë nuk e dija, unë zakonisht shkruaj SlackBuilds dhe e vërteta është se ndryshoret e deklaruara si në VAR1 janë me bollëk në këto skenare. Një kërkim i shpejtë në google më ndihmoi të sqaroja këtë pyetje, unë e ndaj me të gjithë në mënyrë që të gjithë të mësojmë:

    script:
    http://pastebin.com/faAQb35w

    Shpjegim:
    Deklarimi i variablave të formës VAR = $ {VAR: -default_value} do të thotë që variabli VAR do të marrë vlerën e paracaktuar_ dhe nëse vetëm vlera është null ose nuk ekziston.

    Shembull praktik:
    kur ekzekuton skriptin, ai kërkon të fusë një vlerë që do të ruhet në ndryshoren VAR, nëse futet diçka do të tregojë se çfarë është futur. Nëse nuk fusim asgjë dhe shtypim enter po deklarojmë ndryshoren VAR si null, prandaj tregon vlerën e paracaktuar.

    Përshëndetje.

    1.    KZKG ^ Gaara dijo

      HAHA nuk e dija se
      Ok, faleminderit shumë mik ... kjo është ajo që unë doja të thoja me fundin e artikullit, unë nuk kam ndërmend të mësoj diçka dhe kaq, unë e di që gjithmonë do të mësoj diçka të re këtu

      Përshëndetje dhe faleminderit edhe një herë.

      1.    i duhur dijo

        ke te drejte, njeriu meson disa gjera ketu.

        pershendetje dhe gezuar festat !! 😀

  4.   Lucas Matthias dijo

    Shumë e mirë dhe e shpjeguar në mënyrë të shkëlqyeshme +1, koha që do t'ju marrë ...
    por ja vlen te mundohem

    1.    KZKG ^ Gaara dijo

      Në të vërtetë unë kam shkruar 80% në vetëm 1 ditë, më është dashur kaq shumë kohë për ta publikuar vetëm sepse interneti im nuk më lejonte.
      Faleminderit për komentin tuaj

  5.   Hugo dijo

    Një mënyrë tjetër për ta bërë atë është përdorimi i DNS, pasi ndonjëherë rrjetet kanë bllokuar protokollin ICMP:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && jehona "Lidhur me rrjetin"

    Ju gjithashtu do të vini re se në këtë shembull kontrolli i vlerës së kthimit është i nënkuptuar

    1.    KZKG ^ Gaara dijo

      Ju si gjithmonë mik, me sugjerime që nuk i njoh plotësisht HAHAHA.
      Faleminderit, komenti vlerësohet dhe hehe ... një tjetër gjë e re që unë mësoj

  6.   Data dijo

    Falënderim

    🙂

  7.   Leper_Ivan dijo

    Edhe pse kanë kaluar disa ditë nga botimi i kësaj teme, ajo më ka shërbyer shumë, tani që bëra një skenar në bash .. Faleminderit Gaara ..

  8.   Edgar navarro dijo

    Doc. Faleminderit për ndihmën që i bëtë të qarta për mua.

    Thjesht një pyetje, si ta bëj që kur një kompjuter të ndalojë së pinguari automatikisht, tjetri të ndryshojë IP. Unë e kam këtë

    për të ndryshuar IP-në
    #! / bin / bash
    ping -c 10 192.168.1.50 # nëse nuk ping automatikisht
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 transmetuar 192.168.1.0
    ifconfig eth0 poshtë
    ifconfig eth0 lart

  9.   Abraham dijo

    sepse kur krahason me nëse e përdor pikëpyetjen? çfarë ndryshimi ka midis vendosjes së? ndonjë letër tjetër

    1.    KZKG ^ Gaara dijo

      $? do të thotë 'dalja ose dalja e mëparshme', që do të thotë, në rast se rezultati i komandës së mëparshme ...

      1.    Andrew dijo

        Ekziston një mënyrë tjetër për të arritur të njëjtin rezultat, duke kaluar komandën ping direkt si argument nëse:

        nëse ping -c 1 IP-ADRESA; atëherë
        jehona "Po është në internet"
        tjetër
        jehona "Jo në rrjet"
        fi

        Ajo që ndodh është që nëse vlerëson vlerën e kthimit të komandës që kaloni si argument, nëse kthen 0 është e vërtetë, gjithçka tjetër është e gabuar. Kllapat katrore janë ekuivalente me komandën e provës. Por ju mund të kaloni çdo komandë si argument (për sa kohë që komanda kthen ndonjë vlerë).

  10.   të fala dijo

    Përshëndetje, si mund ta ekzekutoj një script.sh me një përdorues X në skenar Unë krijoj një përdorues Y, dhe ai përdorues Y vazhdon ekzekutimin e skriptit.sh

    A mund te behet kjo ??

  11.   kuktos dijo

    Shumë interesante, faleminderit!

  12.   Francisco dijo

    Faleminderit për kontributin, kam një orë që e kuptoj xD, por e kuptova !!!!.

  13.   Elo dijo

    Skenari është në rregull. Aritmetikisht, mund të bëhet edhe si ($? == 0) nëse është e barabartë me zero nuk është në rrjet, përndryshe është në rrjet. Dhe nëse akoma duam ta bëjmë pak më interaktive mund të themi:
    echo -n Vendosni IP:
    lexo ip
    ping -c 1 $ ip

  14.   Dario dijo

    Përshëndetje, unë jam shumë i ri për këtë, po përpiqem të bëj një numër bilete (alfanumerik) përmes një leximi dhe dua që nëse ajo që futet të ketë formatin e duhur (ABC-123456) të ekzekutojë një komandë "x" dhe unë nuk ' t di ta bësh, a mund të më ndihmosh?

    jehona "Fut biletën"
    lexo -p biletë

    nëse $ biletë = "asnjë ide (formati ABC-123456"); pastaj cp file.txt $ biletë; tjetër jehonë "Formati i gabuar, provo përsëri"; lexo -p; fi

    Sigurisht që është e tmerrshme dhe ata qeshin haha, por siç thashë unë po filloj me këtë.

    Nëse e shpjegoj keq, ju lutem më tregoni dhe përpiqem të bëj më mirë.

    Përqafoni të gjithë.

  15.   Umberto Y dijo

    Shpjegim i shkëlqyeshëm, përshëndetje

  16.   i shkathët dijo

    Unë kam pak dyshime me if, else dhe të tjerët.
    Unë dua një skript për të kontrolluar nëse ekziston një skedar (një nga regjistrat) dhe nëse jo, për ta krijuar atë dhe më vonë për të shkruar në të. Por nëse ekziston, unë dua që ju thjesht t'i shkruani.

    Ajo që kam është:

    data = `data -R`
    #Po testoja datën e variablit, e cila nuk përditësohet midis fillimit të a
    #proces dhe përfundon, ndonjëherë mund të kalojë një orë dhe koha e duhur nuk del.

    nëse [-f /home/user/logs/test.log];
    pastaj
    prek /home/usuario/logs/test.log
    tjetër
    jehonë "$ data: Përditësuar" >> /home/user/logs/test.log
    jehonë «————————————————-» >> /home/user/logs/test.log
    fi

    Në teori duhet të jetë mirë, por realiteti është se nuk përditësohet nëse skedari i referuar tashmë ekziston

    1.    i shkathët dijo

      me fal, e pashe qe nuk eshte derguar dhe eshte dyfishuar