Bash: Шарттар (if-then-else)

Сәлем 😀

Бұл жолы мен сізге шартты сценарийді қалай жасау керектігін көрсетемін Bash, аударылған:

Егер сіз қалаған X нәрсе орындалса, Y әрекеті орындалады, егер ол орындалмаса, онда тағы бір әрекет жасалады.

Қарапайым түсініктеме жоқ 😀

Енді мен бірнеше минут осы оқулықта қолдануға болатын бірнеше мысал туралы ойладым, келесі дилемма / проблема / жағдай маған келді:

Біз өз компаниямыздың желісіндеміз және X компьютердің желіге қосылған-қосылмағанын білгіміз келеді. Ол үшін біз а сценарий ол не істейді пинг сол компьютерге, егер ол желіде болса (яғни, егер ол пинг) бізге ИӘ екенін айтады, ол желіде, әйтпесе (ол желіде жоқ) ол бізге оның желіде ЕМЕС екенін айтады.

Мұны жасағаннан кейін, енді мен шарттармен қалай велосипедпен жүруге болатынын түсіндіремін

Міне код:

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

Уайымдамаңыз, мен сізге осыны егжей-тегжейлі түсіндіріп беремін😉

пинг біз қолданатын пәрмен және бұл компьютердің желіде бар-жоғын білуге ​​мүмкіндік береді. Желіде қандай-жоқтығын тексергіміз келетінін білу үшін біз өзгеруіміз керек IP-АДРЕС біз тексергісі келетін ДК-нің IP-мекен-жайы анық.

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

Егер сізде бұған күмәніңіз болса, ауыртпалықсыз ... олар осылай дейді және мен оларға тағы да қуанышпен түсіндіріп беремін 😉

Енді цикл басталды, өйткені мен жай түсіндіргенім қалыпты бұйрық / әрекеттен басқа ештеңе емес 😀

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

Сіз мұны түсінуіңіз үшін мен Баштың өте маңызды бөлшегін түсіндіремін

Тақырыптың ең білгірі мені қате немесе сол сияқты деп көрсетуі мүмкін, бірақ, мен мұны жаңадан бастағандарға немесе одан да аз мамандарға жазамын, егер олар түсінсе, сонда керемет 😉

Бұл сол сияқты болады Bash бұл ұқсас нәрсе 0 y 1, яғни, сіз бұйрық немесе әрекет орындалған кезде не тірісіз, не өлесіз: Не жақсы орындалды Проблема жоқ (1), немесе кейбіреулері болды проблема немесе қателік (0).

Біз X әрекетін немесе бұйрығын орындаймыз, және біз жасаған нәрсе жақсы немесе жаман орындалған болуы мүмкін, ол қате жіберген болуы мүмкін немесе болмауы мүмкін, және дәл осында егжей-тегжейлі 😉

Егер біз не жібереміз (бұл жағдайда: ping -c 1 IP-АДРЕС) қате жібермеді және ол сәтті болды, сондықтан ол мәнді қайтарады: 1 . Әйтпесе, егер әрекет (яғни пинг) сәтсіз болса, ол мәнді қайтарады 0.

 Сонымен, жоғарыда келтірілген кодтың мағынасы:

Егер 0 мәні қайтарылса

Мәтінді көрсету: «Желіде жоқ»

Әйтпесе (және 0 ЕМЕС, бірақ 1 қайтарылады)

Мәтінді көрсету: «Егер ол желіде болса«

Мен сізге жаңа түсіндірген бұл бізге болашақта көп нәрсе үшін қызмет етеді, өйткені егер X әрекеті қате жіберген болса, Y әрекетін жасаңыз, ал егер X әрекеті оған жауап бермеген болса, онда бұл өте пайдалы. қате, содан кейін Z әрекетін жасаңыз.

Мен кейбіреулердің шатасып кетуі мүмкін екенін білемін, сондықтан мен оны әр түрлі етіп түсіндіруге тырыстым, оны бәріне немесе басқаша түсінуге тырыстым. Егер біреу күмәнданған болса, маған хабарлаңыз.

Енді сценарийімізді жасайық let's

Біз осы оқулықтағы қадамдарды орындауымыз керек: Bash: орындалатын сценарийді қалай жасауға болады

Содан кейін келесі кодты сол файлға көшірейік (сценарий.sh), ал соңында «Шығу»(Тырнақшасыз):

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

Бұл келесідей болуы керек (олар IP-ADDRESS-ті қалаған 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 содан кейін қос тырнақшалар арасында («) мәтін болса, бұл мәтін терминалда пайда болады. Яғни, егер:

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%

 

Жақсы ... енді ештеңе қосуға болмайды.

Бұл қарапайым, иә қарапайым нәрсе, бірақ мен оны мүмкіндігінше жақсы түсіндіруге тырыстым, өйткені бәрінде де бағдарламашының жаны бола бермейді және біз бірнеше рет осындай (немесе ұқсас) сценарийлер жасауымыз керек, кез-келген жағдайда бұл мақала сізге пайдалы болады деп үміттенемін біреу 🙂

Кез-келген күмән, сұрақ, шағым немесе ұсыныс осында қалдырыңыз, мен сізге қуанышпен жауап беремін, осылайша бәріміз білеміз 😀

тілекпен


Мақаланың мазмұны біздің ұстанымдарымызды ұстанады редакторлық этика. Қате туралы хабарлау үшін нұқыңыз Мұнда.

23 пікір, өз пікіріңізді қалдырыңыз

Пікіріңізді қалдырыңыз

Сіздің электрондық пошта мекен-жайы емес жарияланады. Міндетті өрістер таңбаланған *

*

*

  1. Деректерге жауапты: Мигель Анхель Гатан
  2. Деректердің мақсаты: СПАМ-ны басқару, түсініктемелерді басқару.
  3. Заңдылық: Сіздің келісіміңіз
  4. Деректер туралы ақпарат: заңды міндеттемелерді қоспағанда, деректер үшінші тұлғаларға жіберілмейді.
  5. Деректерді сақтау: Occentus Networks (ЕО) орналастырған мәліметтер базасы
  6. Құқықтар: Сіз кез-келген уақытта ақпаратты шектей, қалпына келтіре және жоя аласыз.

  1.   Джалс дижо

    Сіз кәсіпқойсыз !!! * немесе *

    1.    KZKG ^ Гаара дижо

      Жоқ
      Егер ол сізге қызмет еткен болса және ол қызықты болса, мен қанағаттанамын 😉

      Сәлемдесу досым

  2.   дұрыс дижо

    @ KZKG ^ Гаара,
    bash бағдарламалау туралы айта отырып, менде мынадай сұрақ бар:
    Айнымалыны осындай VAR = сәлемдесу мен оны келесідей VAR = $ {VAR: -сәлем} деп жариялаудың айырмашылығы неде?

    Мен түсіндіремін:
    http://pastebin.com/a3cfWXeD

    сәлемдесу 😉

    1.    KZKG ^ Гаара дижо

      Сәлем 😀
      Мен мүлдем баштың маманы емеспін ... шыныменде, менің ойым жоқ LOL !!
      Мен айнымалыларды жариялай отырып, келесідей:
      : ${OPTFOLDER:="/opt/"}

      Бірақ мен әрдайым осылай жасайтын болғандықтан, айырмашылық адал болуы мүмкін екенін білмеймін 🙁

  3.   дұрыс дижо

    @ KZKG ^ Гаара
    Мен сұрақ қойдым, өйткені мен де білмейтінмін, мен әдетте SlackBuilds жазамын, ал шындық мынада: VAR1-де жарияланған айнымалылар бұл сценарийлерде көп. Google-ді жылдам іздеу маған осы сұрақты анықтауға көмектесті, мен бәрімен бөлісу үшін бәрімен бөлісемін:

    Сценарий:
    http://pastebin.com/faAQb35w

    Түсініктеме:
    VAR = $ {VAR: -default_value} формасының айнымалыларын жариялау VAR айнымалысы мәні нөл болса немесе ол болмаған жағдайда ғана default_value мәнін қабылдайтынын білдіреді.

    Практикалық мысал:
    Сценарийді орындау кезінде VAR айнымалысында сақталатын мәнді енгізу сұралады, егер бірдеңе енгізілсе, ол не енгізілгенін көрсетеді. Егер біз ештеңе енгізбесек және enter пернесін бассақ, онда біз VAR айнымалысын нөл деп жариялаймыз, демек, ол value_default мәнін көрсетеді.

    Құттықтаулар.

    1.    KZKG ^ Гаара дижо

      ХАХА Мен мұны білмедім 😀
      Жарайды, досыма көп рахмет ... мен мақаланы аяқтағысы келген кезде осыны айтқым келді, мен бірдеңе үйреткім келмейді және солай, мен мұнда әрдайым жаңа нәрсе үйренетінімді білемін 😀

      Тағы бір рет сәлем және рахмет.

      1.    дұрыс дижо

        сенікі дұрыс, адам бірнеше нәрсені осы жерден біледі.

        құттықтау және мерекелеріңіз құтты болсын !! 😀

  4.   Лукас Матиас дижо

    Тамаша және өте жақсы түсіндірілген +1, бұл сізге уақытты қажет етеді ...
    бірақ күш салуға тұрарлық 😉

    1.    KZKG ^ Гаара дижо

      Негізі мен 80 күнде 1% жаздым, оны интернетке жібермеу үшін оны жариялау маған көп уақыт алды.
      Пікіріңіз үшін рақмет 😉

  5.   Уго дижо

    Мұны істеудің тағы бір тәсілі - DNS-ті қолдану, өйткені кейде желілерде ICMP протоколы бұғатталады:

    (хост -ta IP-ADDRESS> / dev / null 2> & 1) && echo «желіге қосылған»

    Сондай-ақ, сіз осы мысалда қайтару мәнін тексеру жанама екенін ескертесіз 😉

    1.    KZKG ^ Гаара дижо

      Сіз әрдайым доссыз, мен толық білмейтін кеңестермен HAHAHA.
      Рақмет, түсініктеме бағаланады және хех ... мен үйренетін тағы бір жаңа нәрсе 😀

  6.   Датукс дижо

    Gracias

    🙂

  7.   Лепер_Иван дижо

    Осы тақырыптың жарияланғанына бірнеше күн өтсе де, маған сценарийді бастан-аяқ жасағаннан кейін маған көп көмектесті .. Рахмет Гаара ..

  8.   Эдгар наварро дижо

    Маған түсінікті жағдай жасағаныңыз үшін рахмет.

    Сұрақ, қалай істеу керек, егер бір компьютер автоматты түрде пинг жасауды тоқтатса, екіншісі 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 ^ Гаара дижо

      $? «алдыңғы нәтиже немесе шығыс» дегенді білдіреді, яғни алдыңғы команданың нәтижесі болған жағдайда ... 🙂

      1.    Андрес дижо

        Осындай нәтижеге қол жеткізудің тағы бір әдісі бар, егер ping пәрменін аргумент ретінде тікелей жіберіп алса, егер:

        егер ping -c 1 IP-ADDRESS; содан кейін
        жаңғырық «Ия бұл желіде»
        тағы
        жаңғырық «Желіде жоқ»
        fi

        Не болады, егер сіз аргумент ретінде берген команданың қайтару мәнін бағаласа, егер 0 мәнін берсе, ол шындыққа сәйкес келеді, ал қалғанының бәрі жалған болады. Квадрат жақшалар тест командасына тең. Бірақ сіз кез-келген команданы аргумент ретінде бере аласыз (егер команда біраз мән қайтарса).

  10.   тілекпен дижо

    Сәлеметсіз бе, мен сценарийде X қолданушысымен script.sh қалай орындалады, мен Y пайдаланушысын жасаймын, ал Y қолданушы script.sh файлын орындауды жалғастырады

    Бұл жасалуы мүмкін бе?

  11.   Куктос дижо

    Өте қызықты, рахмет!

  12.   Francisco дижо

    Қосқаныңыз үшін рахмет, мен оны түсінуге бір сағат болдым xD, бірақ мен оны түсіндім !!!!.

  13.   Қуаныш дижо

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

  14.   Дарио дижо

    Сәлеметсіз бе, мен бұған өте жаңалықпын, мен билеттің нөмірін (әріптік-цифрлық) оқылым арқылы жасауға тырысамын және егер енгізілген дұрыс форматта болса (ABC-123456) «x» командасын орындайтын болса. мен оны қалай жасау керектігін білмеймін, маған көмектесе аласыз ба?

    echo «Билетті енгізу»
    оқыңыз -p билеті

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

    Әрине, бұл өте қорқынышты және олар күледі хаха, бірақ мен айтқандай, мен мұны енді бастаймын.

    Егер мен нашар түсіндірсем, айтыңызшы, мен одан да жақсысын жасауға тырысамын.

    Барлығын құшақтаңыз.

  15.   Хамберто Ю дижо

    Өте жақсы түсіндіру, сәлемдесу