Баш: Шарттар (if-then-else)

Салам 😀

Бул жолу сизге шарттуу сценарийди кантип жасоону көрсөтөм Баш, которулган:

Эгер сиз каалаган X нерсе аткарылса, Y иш-аракет аткарылат, эгер ал аткарылбаса, анда дагы бир иш-аракет жасалат.

Жөнөкөй түшүндүрмө жок 😀

Эми бир нече мүнөттөрдө ушул окуу куралы боюнча бир мисал келтирсем деп ойлонуп көрдүм, менин башыма төмөнкүдөй дилемма / маселе / ​​кырдаал келди:

Биз өзүбүздүн компаниянын тармагындабыз жана биз X компьютердин тармакка туташканын билгибиз келет. Бул үчүн биз а кол шрифти ал эмне кылат пинг ошол компьютерге жана ал тармакта болсо (б.а. кайтарса пинг) бизге Ооба, ал тармакта, башкача айтканда (ал тармакта жок), ал бизге Желеде ЖОК экендигин айтат.

Бул бүткөндөн кийин, эми шарттар менен кантип велосипед тебүүнү түшүндүрүп берем will

Бул жерде код:

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

Капа болбоңуз, мен муну сизге кенен түшүндүрүп берем I'll

пинг биз колдоно турган буйрук, жана ал компьютер тармакта болсо, бизге айтып берет. Кайсы компьютерди тармакта бар же жок экендигин текшергибиз келгенин айтыш үчүн, биз өзгөрүшүбүз керек IP АДРЕС албетте, биз текшерүүнү каалаган ЖКнын IP дареги.

Көрүнүп тургандай, мен «-c 1«, Бизге эмне керек. Компьютерди пингдеп жатканда, бул аракет өзүбүздү өзүбүз басмайынча токтобойт (пинг) [Ctrl] + [C], ошондуктан «-c 1»Биз ага бир гана текшерүүнү (бир гана пинг аракети менен) жасоону буйрук кылабыз, башка эч нерсени жасабаңыз, бул аны токтоосуз токтойт, башкача айтканда ... компьютер тармакта бир жолу болгонун текшерет.

Эгер буга шек санасаңыз, эч кандай оору жок ... алар ошентип айтышат жана мен аларга дагы бир жолу түшүндүрүп берүүгө кубанычтамын

Эми цикл келди, анткени мен жөн гана түшүндүргөн нерсе кадимки буйрук / иш-аракеттерден башка эч нерсе эмес 😀

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

Сиз муну түшүнүшүңүз үчүн, Баштын өтө маанилүү бир деталын түшүндүрүп берем

Бул теманы эң жакшы билген адам мени туура эмес же ушул сыяктуу нерсе катары көрсөтүшү мүмкүн, бирок, мен муну жаңы башталгандарга же азыраак адистерге жазам, эгерде алар түшүнүшсө, анда great

Бул сыяктуу эле болот Баш ал окшош нерсе 0 y 1, башкача айтканда, сиз буйрук же иш-аракет аткарылганда, же сиз тирүүсүз же сиз өлгөнсүз: Же жакшы аткарылган Көйгөй жок (1), же кээ бирлери болгон көйгөй же ката (0).

Биз X иш-аракетти же буйрукту аткарабыз, же жакшы же жаман аткарылган болушу мүмкүн, ал ката кетирген же болбогон болушу мүмкүн, жана бул жерде деталь detail

Эгерде биз эмнени жөнөтсөк (бул учурда: ping -c 1 IP-АДРЕС) ката кетирген жок жана ийгиликтүү болду, ошондуктан ал маанини кайтарып берет: 1 . Болбосо, эгерде иш-аракет (башкача айтканда, пинг) ийгиликтүү болбой калса, анда ал маанисин кайтарып берет 0.

 Акыры, жогорудагы код эмнени билдирет:

Эгер 0 мааниси кайтарылса

Текстти көрсөтүү: «Тармакта эмес»

Болбосо (жана 0 эмес, бирок 1 кайтарылып берилет)

Текстти көрсөтүү: «Эгер ал тармакта болсо«

Мен сизге жаңы гана түшүндүрүп берген нерсе, келечекте бизге көп нерсе үчүн кызмат кылат, анткени эгер X иш-аракетинде ката кетсе, анда Y иш-аракетин жасаңыз, эгер X иш-аракетинде ката кетпесе, анда Z иш-аракетин жасаңыз.

Айрымдар бир аз чаташып кетиши мүмкүн экендигин билем, ошондуктан мен аны бир нече жолу ар башкача түшүндүрүп, ар кимге тигил же бул жакта түшүнүктүү болушуна аракет кылдым. Эгер кимдир бирөө күмөн санатса, мага кабарлаңыз.

Эми сценарийибизди түзөлү let's

Бул окуу куралы боюнча кадамдарды аткарышыбыз керек: Баш: Аткарылуучу сценарийди кантип жасоого болот

Андан кийин төмөнкү файлды ошол файлга көчүрөлү (script.sh), жана аягында «чыгуу»(Цитатасыз):

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

Ал мындай болушу керек (IP-АДРЕСти каалаган IPге өзгөрткөнүңүздү эсиңизден чыгарбаңыз)

Бул жерден сиз иштеп жаткан сценарийди көрө аласыз:

% CODE1%

 

Көрүнүп тургандай, акыры ал бизге «Ооба, ал тармакта»🙂

Бул жерде маанилүү нерсе, алар чындыгында шарттар жөнүндө ушуну түшүнүшөт, ошондуктан дагы бир жолу түшүндүрүп берүү үчүн сизге дагы бир код калтырдым, бирок башка көз караш менен.

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

Мунун мааниси жөнөкөй, мен түшүндүрмө сабын сапка калтырам:

1-сап: Биз жазганыбыз, бул өзгөрмө мааниси болот «жазышуу»(Цитаталарсыз).

2-сап: Өзгөрмөнүн мазмунун (биз жөн гана жаздык) экендигин текшериңиз 3.

3-сап: Болгон учурда 3, ал бизге текстти көрсөтөт «Correcto»(Цитаталарсыз).

4-сап: Болбосо (башкача айтканда, биз 3 жазбасак).

5-сап: Ал бизге «текстин көрсөтөттуура эмес»(Цитаталарсыз).

6-сап: Шарттын бүтүшү.

Алар түшүнө алышкан, эгерде биз айта турган болсок жаңырык андан кийин эки тырмакчанын ортосунда («) текст, бул тексттин терминалда көрсөтүлүшүн шарттайт. Башкача айтканда, эгер:

echo "esto es una prueba"

Ал бизге терминалда текстти көрсөтөт: бул тест

Бирок ушул экинчи мисалга кайрылып, мен бул экинчи сценарийдин пайдалуулугун (жана аткарылышын) ӨТӨ жөнөкөй нерсе менен көрсөтөм ... типтүү «1 + 2 канча турат?«

Толук сценарийдин кодун калтырам:

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

Сценарий кандайча иштейт:

% CODE2%

 

Ошондой эле ... дагы бир нерсе кошуу керек.

Бул башталгыч нерсе, жөнөкөй ооба, бирок ошентсе да мен аны мүмкүн болушунча жакшы түшүндүрүүгө аракет кылдым, анткени ар бир адамда программисттин жан дүйнөсү боло бербейт, жана биз көп жолу ушул сыяктуу сценарийлерди жасашыбыз керек (же ушул сыяктуу), кандай болгон күндө дагы бул макала сиз үчүн пайдалуу болот деп үмүттөнөм. бирөө 🙂

Кандайдыр бир күмөн саноолор, суроолор, даттануулар же сунуштар болсо, ушул жерге калтырыңыз, мен сизге кубаныч менен жооп берем жана ошентип, баарыбыз бир аз көбүрөөк билип алабыз learn

Урматтоо менен


Макаланын мазмуну биздин принциптерге карманат редакциялык этика. Ката жөнүндө кабарлоо үчүн чыкылдатыңыз бул жерде.

23 комментарий, өзүңүздүкүн калтырыңыз

Комментарий калтырыңыз

Сиздин электрондук почта дареги жарыяланбайт. Милдеттүү талаалар менен белгиленет *

*

*

  1. Маалыматтар үчүн жооптуу: Мигель Анхель Гатан
  2. Маалыматтын максаты: СПАМды көзөмөлдөө, комментарийлерди башкаруу.
  3. Мыйзамдуулук: Сиздин макулдугуңуз
  4. Маалыматтарды берүү: Маалыматтар үчүнчү жактарга юридикалык милдеттенмелерден тышкары билдирилбейт.
  5. Маалыматтарды сактоо: Occentus Networks (ЕС) тарабынан уюштурулган маалыматтар базасы
  6. Укуктар: Каалаган убакта маалыматыңызды чектеп, калыбына келтирип жана жок кыла аласыз.

  1.   Джалс ал мындай деди:

    Сиз профессионалсыз !!! * же *

    1.    KZKG ^ Gaara ал мындай деди:

      Нах бекер 😀
      Эгер сизге кызмат кылып, кызыктуу болсо, мен ыраазы болдум 😉

      Салам дос

  2.   ылайык ал мындай деди:

    @ KZKG ^ Gaara,
    Баш программалоо жөнүндө айта турган болсок, менде бир суроо бар:
    Мындай VAR = салам жана мындай VAR = $ {VAR: -hello} сыяктуу өзгөрмөлөрдү жарыялоонун кандай айырмасы бар?

    Мен түшүндүрөм:
    http://pastebin.com/a3cfWXeD

    саламдашуу 😉

    1.    KZKG ^ Gaara ал мындай деди:

      Салам 😀
      Ооба, мен баштын адиси эмесмин ... чындыгында, менин оюм жок LOL !!
      Мен өзгөрмөлөрдү жарыялаганымда, ал мындай:
      : ${OPTFOLDER:="/opt/"}

      Бирок мен ар дайым ушинтип жүргөндүктөн, чындыгында кандай айырмачылык болушу мүмкүн экендигин билбейм 🙁

  3.   ылайык ал мындай деди:

    @ KZKG ^ Gaara
    Чындыгында, мен дагы билбегендигим үчүн, мындай суроону бердим, адатта SlackBuilds деп жазам жана чындыгында VAR1дегидей өзгөрүлмө бул скрипттерде көп. Google'ди тез издөө мага бул суроону тактоого жардам берди, мен бардыгыбызга билүү үчүн, аны баарына айтып берем:

    Script:
    http://pastebin.com/faAQb35w

    Explanation:
    VAR = $ {VAR: -default_value} формасындагы өзгөрмөлөрдү жарыялоо VAR өзгөрмө default_value маанисин кабыл алат, эгерде мааниси нөл болсо же жок болсо.

    Практикалык мисал:
    сценарийди аткарууда VAR өзгөрмөсүндө сакталуучу маанини киргизүүнү суранат, эгер кандайдыр бир нерсе киргизилген болсо, анда эмне киргизилгенин көрсөтөт. Эгерде биз эч нерсе киргизбей, enter баскычын бассак, анда VAR өзгөрмөсүн нөл деп жарыялайбыз, демек, ал default_value дегенди билдирет.

    Салам.

    1.    KZKG ^ Gaara ал мындай деди:

      ХАХА Мен муну билген эмесмин 😀
      Макул, чоң рахмат досум ... мен макаланын аягында ушуну айткым келди, мен бир нерсени үйрөтөйүн деген оюм жок, ошондо, мен ар дайым жаңы нерселерди үйрөнөрүмдү билем 😀

      Дагы бир жолу салам жана ыраазычылык.

      1.    ылайык ал мындай деди:

        сиз туура айтасыз, адам бул жерде бир нече нерсени үйрөнөт.

        куттуктоо жана майрамыңыздар менен !! 😀

  4.   Лукас Матиас ал мындай деди:

    Керемет жана укмуштай түшүндүрүлдү +1, сизге убакыт талап кылынат ...
    бирок мен аракет кылганга арзыдым 😉

    1.    KZKG ^ Gaara ал мындай деди:

      Чындыгында мен 80 күндө эле 1% жаздым, аны интернетке киргизбей койгондуктан, аны жарыялоо ушунча убакытты алды.
      Сиздин комментарий үчүн рахмат 😉

  5.   Уго ал мындай деди:

    Муну жасоонун дагы бир жолу - DNSди колдонуу, анткени кээде тармактарда ICMP протоколу бөгөттөлөт:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Тармакка туташты"

    Ошондой эле, бул мисалда кайтаруу маанисин текшерүү imp мааниде болбогонун байкайсыз

    1.    KZKG ^ Gaara ал мындай деди:

      Сиз ар дайым дос катары, мен толук билбеген кеңештер менен HAHAHA.
      Рахмат, комментарий бааланат жана хехе ... мен үйрөнгөн дагы бир жаңы нерсе 😀

  6.   Datux ал мындай деди:

    ыракмат

    🙂

  7.   Leper_Ivan ал мындай деди:

    Бул теманын жарыяланганына бир нече күн өтсө дагы, ал мага чоң кызмат кылды, эми мен баш сценарийди жасадым .. Рахмат Гаара ..

  8.   Edgar navarro ал мындай деди:

    Док.Мени түшүнүктүү кылып көрсөткөн жардамыңыз үчүн рахмат.

    Бир эле суроо, кантип бир компьютер автоматтык түрдө пинг кылууну токтотсо, экинчиси IPин өзгөртүп коет деп эмне кылсам болот. Менде бул бар.

    IP өзгөртүү
    #! / bin / bash
    ping -c 10 192.168.1.50 # Эгер автоматтык түрдө пинг жасабаса
    ifconfig eth0 192.168.1.50 netmask 255.255.255.0 берүү 192.168.1.0
    ifconfig eth0 түшүп
    ifconfig eth0 чейин

  9.   Ыбрайым ал мындай деди:

    анткени эгерде сиз суроо белгисин колдонгон болсоңуз менен салыштыруу учурунда? коюунун ортосунда кандай айырма бар? башка кат

    1.    KZKG ^ Gaara ал мындай деди:

      $? "мурунку натыйжа" дегенди билдирет, башкача айтканда, мурунку буйруктун натыйжасында ... 🙂

      1.    Andrew ал мындай деди:

        Ушул эле натыйжага жетүүнүн дагы бир жолу бар: ping командасын түздөн-түз аргумент катары өткөрүп, эгерде:

        эгер ping -c 1 IP-АДРЕС; анда
        echo "Ооба, ал тармакта"
        дагы
        "Тармакта жок" жаңырыгы
        fi

        Эмне болот, эгер сиз аргумент катары берген буйруктун кайтарым маанисин бааласа, ал 0 кайтарса, ал чын, дагы бир нерсе жалган. Квадрат кашаа сыноо командасына барабар. Бирок сиз каалаган буйрукту аргумент катары бере аласыз (буйрук кандайдыр бир маани берсе гана).

  10.   Урматтоо менен ал мындай деди:

    Саламатсызбы, мен кандайча script.sh скриптиндеги X колдонуучусун колдонуп, Y колдонуучусун жаратам жана ал Y колдонуучусу script.sh аткарууну улантууда

    Муну жасаса болобу ??

  11.   Куктос ал мындай деди:

    Абдан кызыктуу, рахмат!

  12.   Диего ал мындай деди:

    Салымыңыз үчүн рахмат, аны түшүнүү үчүн бир саат убакыт болду xD, бирок мен аны түшүндүм !!!!.

  13.   Eloy ал мындай деди:

    Сценарий жакшы. Арифметикалык түрдө, аны нөлгө барабар болсо ($? == 0) катары жасаса болот, ал тармакта жок, болбосо ал тармакта. Эгер биз аны дагы бир аз интерактивдүү кылгыбыз келсе, анда мындай деп айта алабыз:
    echo -n IP дарегин киргизиңиз:
    окуу ip
    ping -c 1 $ ip

  14.   Dario ал мындай деди:

    Салам жана мен муну кантип жасоону билбейм, сиз мага жардам бере аласызбы?

    "Билетти киргиз" жаңырыгы
    окуу -p билети

    эгер $ билет = "идея жок (ABC-123456 форматы"); андан кийин cp file.txt $ билет; else echo "туура эмес формат, дагы бир жолу аракет кылып көрүңүз"; окуу -p; fi.

    Албетте, бул коркунучтуу жана алар хаха күлүшөт, бирок мен айткандай, мен ушул нерсени жаңы баштайм.

    Эгерде мен жаман түшүндүрүп берсем, мага айтып бериңиз, мен андан дагы жакшы нерселерди жасаганга аракет кылам.

    Баарын кучакта.

  15.   Humberto Y ал мындай деди:

    Мыкты түшүндүрмө, саламдашуу