Баш: Умовы (калі-то-інакш)

Прывітанне 😀

На гэты раз я пакажу вам, як зрабіць сцэнарый з умовай у Біць, што ў перакладзе:

Калі 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-адрас ПК, які мы хочам праверыць.

Як бачыце, я паставіў «-с 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-дзеянне.

Я ведаю, што некаторыя могуць крыху ўцягнуцца, таму я паспрабаваў растлумачыць гэта некалькімі рознымі спосабамі, спрабуючы прымусіць усіх так ці інакш зразумець гэта. Калі хто-небудзь застанецца пад сумневам, дайце мне ведаць.

Зараз зробім наш сцэнар 😀

Мы павінны прытрымлівацца крокаў у гэтым уроку: Bash: Як зрабіць выкананы сцэнар

Тады давайце скапіруем наступны код у гэты файл (сцэнар.ш), а ў канцы скажам «выхад»(Без двукоссяў):

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

Гэта павінна выглядаць так (памятайце, што вы, напэўна, змянілі IP-АДРАС на патрэбны вам IP):

Тут вы можаце ўбачыць запушчаны сцэнар:

% КОД 1%

 

Як бачыце, у рэшце рэшт ён кажа нам «Так, гэта ў сетцы»🙂

Тут важна тое, што яны на самой справе разумеюць гэта наконт умоў, таму я пакідаю вам яшчэ адзін код, каб растлумачыць гэта яшчэ раз, але з іншага пункту гледжання.

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

Што гэта азначае проста, я пакідаю тлумачэнне радок за радком:

1-ы радок: Тое, што мы пішам, будзе значэннем зменнай «тэкставыя паведамленні»(Без двукоссяў).

2-гі радок: Праверце, ці ёсць змест зменнай (тое, што мы толькі што напісалі) 3.

3-ы радок: У выпадку быцця 3, ён пакажа нам тэкст «Выпраўце»(Без двукоссяў).

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

Вось як працуе сцэнар:

% КОД 2%

 

І добра ... больш нічога не трэба дадаць.

Гэта нешта элементарнае, простае, так, але ўсё ж я паспрабаваў растлумачыць гэта як мага лепш, бо не ва ўсіх ёсць душа праграміста, і шмат разоў нам трэба рабіць такія сцэнарыі (ці падобныя), у любым выпадку я спадзяюся, гэты артыкул камусьці спатрэбіцца 🙂

Любыя сумневы ці пытанні, скаргі ці прапановы, калі ласка, пакіньце тут, я з задавальненнем адкажу вам, і такім чынам, мы ўсе даведаемся крыху больш 😀

прывітанне


Змест артыкула адпавядае нашым прынцыпам рэдакцыйная этыка. Каб паведаміць пра памылку, націсніце тут.

26 каментарыяў, пакіньце свой

Пакіньце свой каментар

Ваш электронны адрас не будзе апублікаваны. Абавязковыя для запаўнення палі пазначаныя *

*

*

  1. Адказны за дадзеныя: Мігель Анхель Гатон
  2. Прызначэнне дадзеных: Кантроль спаму, кіраванне каментарыямі.
  3. Легітымнасць: ваша згода
  4. Перадача дадзеных: Дадзеныя не будуць перададзены трэцім асобам, за выключэннем юрыдычных абавязкаў.
  5. Захоўванне дадзеных: База дадзеных, размешчаная Occentus Networks (ЕС)
  6. Правы: у любы час вы можаце абмежаваць, аднавіць і выдаліць сваю інфармацыю.

  1.   Джалс сказаў

    Вы прафесіянал !!! * альбо *

    1.    KZKG ^ Гаара сказаў

      Ды не дарма 😀
      Калі вам гэта паслужыла, і гэта цікава, я задаволены 😉

      Прывітанне сябар

  2.   правільны сказаў

    @ KZKG ^ Гаара,
    калі казаць пра праграмаванне bash, у мяне пытанне:
    У чым розніца паміж абвяшчэннем зменнай накшталт гэтага VAR = прывітанне і дэклараваннем падобнага VAR = $ {VAR: -hello}?

    Я тлумачу:
    http://pastebin.com/a3cfWXeD

    прывітанне 😉

    1.    KZKG ^ Гаара сказаў

      Прывітанне 😀
      Ну, я ўвогуле не эксперт у bash ... на самай справе, я не ўяўляю LOL !!
      Як я абвяшчаю зменныя, гэта выглядае так:
      : ${OPTFOLDER:="/opt/"}

      Але паколькі я заўсёды рабіў гэта так, я не ведаю, якая розніца можа быць шчырай 🙁

  3.   правільны сказаў

    @ KZKG ^ Гаара
    Ну, я задаў пытанне, бо праўда ў тым, што я таксама не ведаў, я звычайна пішу SlackBuilds, і праўда ў тым, што зменных, заяўленых як у VAR1, шмат у гэтых сцэнарыях. Хуткі пошук у Google дапамог мне растлумачыць гэтае пытанне, я дзялюся ім з усімі, каб мы ўсе маглі даведацца:

    Сцэнарый:
    http://pastebin.com/faAQb35w

    Тлумачэнне:
    Абвяшчэнне зменных выгляду VAR = $ {VAR: -default_value} азначае, што зменная VAR будзе прымаць значэнне default_value тады і толькі тады, калі значэнне будзе нулявым ці не існуе.

    Практычны прыклад:
    пры выкананні сцэнарыя ён просіць увесці значэнне, якое будзе захоўвацца ў зменнай VAR, калі нешта будзе ўведзена, яно пакажа, што было ўведзена. Калі мы нічога не ўводзім і націскаем enter, мы абвяшчаем зменную VAR нулявой, таму яна паказвае default_value.

    Прывітанне.

    1.    KZKG ^ Гаара сказаў

      ХАХА Я гэтага не ведаў 😀
      Добра, вялікі дзякуй ... гэта я меў на ўвазе пад канцом артыкула, я не збіраюся чамусьці вучыць, і ўсё, я ведаю, што тут заўсёды даведаюся нешта новае 😀

      Прывітанне і яшчэ раз дзякуй.

      1.    правільны сказаў

        Вы маеце рацыю, тут можна даведацца некалькі рэчаў.

        прывітанне і са святам !! 😀

  4.   Лукас Маціяс сказаў

    Выдатна і выдатна патлумачыў +1, час у вас спатрэбіцца ...
    але я варты намаганняў 😉

    1.    KZKG ^ Гаара сказаў

      Я на самой справе напісаў 80% усяго за 1 дзень, так доўга я размясціў яго толькі таму, што мой Інтэрнэт мне не дазволіў.
      Дзякуй за каментарый 😉

  5.   Х'юга сказаў

    Іншы спосаб зрабіць гэта - выкарыстанне DNS, бо часам сеткі блакуюць пратакол ICMP:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Падключаны да сеткі"

    Вы таксама заўважыце, што ў гэтым прыкладзе праверка значэння вяртання няяўная 😉

    1.    KZKG ^ Гаара сказаў

      Вы як заўсёды сябар, з парадамі, якія я не ведаю цалкам ХАХАХА.
      Дзякуй, каментарый ацэнены і хе-хе ... яшчэ адна новая рэч, пра якую я даведаюся 😀

  6.   Датукс сказаў

    дзякуй

    ????

  7.   Лепер_Іван сказаў

    Нягледзячы на ​​тое, што з моманту публікацыі гэтай тэмы прайшло некалькі дзён, яна мне вельмі паслужыла, цяпер, калі я зрабіў сцэнар на bash .. Дзякуй Гаара ..

  8.   Эдгар Навара сказаў

    Док. Дзякуй за дапамогу, якую вы мне зразумелі.

    Проста запыт, як мне зрабіць, каб, калі адзін кампутар перастае аўтаматычна пінгаваць, іншы змяняе IP. У мяне такое ёсць.

    змяніць IP
    #! / Bin / Баш
    ping -c 10 192.168.1.50 # Калі ён не пінгуе аўтаматычна
    ifconfig eth0 192.168.1.50 маска сеткі 255.255.255.0 трансляцыя 192.168.1.0
    ifconfig eth0 ўніз
    ifconfig eth0 ўверх

  9.   Абрагам сказаў

    таму што пры параўнанні са знакам, калі вы выкарыстоўваеце пытальнік? якая розніца паміж ставіць? любы іншы ліст

    1.    KZKG ^ Гаара сказаў

      $? азначае "папярэдні вывад", гэта значыць у выпадку папярэдняй каманды ... 🙂

      1.    Эндру сказаў

        Ёсць яшчэ адзін спосаб дасягнуць таго ж выніку, перадаўшы каманду ping непасрэдна як аргумент if:

        калі пінг -c 1 IP-АДРАС; тады
        рэха "Так, гэта ў сетцы"
        яшчэ
        рэха "Не ў сетцы"
        fi

        Што адбываецца, так гэта тое, што калі ацэньваецца зваротнае значэнне каманды, якую вы перадаеце ў якасці аргумента, калі яна вяртае 0, гэта праўда, астатняе ілжывае. Квадратныя дужкі эквівалентныя тэставай камандзе. Але вы можаце перадаць любую каманду ў якасці аргумента (пакуль каманда вяртае нейкае значэнне).

  10.   прывітанне сказаў

    Добры дзень, як мне выканаць script.sh з карыстальнікам X, у сцэнарыі я ствараю карыстальніка Y, і гэты карыстальнік Y працягвае выконваць script.sh

    Ці можна гэта зрабіць ??

  11.   Куктос сказаў

    Вельмі цікава, дзякуй!

  12.   Францыска сказаў

    Дзякуй за ўклад, я правёў гадзіну, каб зразумець яго xD, але я зразумеў !!!!.

  13.   Элой сказаў

    Сцэнар выдатны. Арыфметычна гэта можа быць зроблена як ($? == 0), калі роўна нулю, яго няма ў сетцы, інакш у сетцы. І калі мы ўсё ж хочам зрабіць яго больш інтэрактыўным, мы можам сказаць:
    echo -n Увядзіце IP:
    чытаць ip
    пінг -c 1 $ ip

  14.   Dario сказаў

    Добры дзень, я зусім не ў гэтым, я спрабую зрабіць нумар білета (літарна-лічбавы) праз счытванне, і я хачу, каб уведзены правільны фармат (ABC-123456) выканаў каманду "x", і я не разумею я не ведаю, як гэта зрабіць, не маглі б вы мне дапамагчы?

    рэха "Увядзіце білет"
    чытаць -p білет

    if $ ticket = "паняцця не маю (фармат ABC-123456"); затым cp file.txt $ білет; else паўтарае "няправільны фармат, паспрабуйце яшчэ раз"; чытаць -p; fi.

    Вядома, гэта жудасна, і яны смяюцца ха-ха, але, як я ўжо казаў, я толькі пачынаю з гэтага.

    Калі я дрэнна тлумачу, скажыце мне, і я паспрабую зрабіць лепш.

    Абдыміце ўсіх.

  15.   Умберта Ю. сказаў

    Выдатнае тлумачэнне, прывітанне

  16.   спрытны сказаў

    Я крыху сумняваюся з if, else і іншымі.
    Я хачу, каб скрыпт правяраў, што файл існуе (адзін з часопісаў), а калі няма, то ствараў яго і пазней запісаў у яго. Але калі ён існуе, я хачу, каб вы проста напісалі яму.

    Што ў мяне ёсць:

    дата = `дата -R`
    #Я тэставаў зменную дату, якая не абнаўляецца паміж пачаткам а
    #працэс і заканчваецца, часам можа прайсці гадзіна, а патрэбны час не выходзіць.

    калі [-f /home/user/logs/test.log];
    затым
    націсніце /home/usuario/logs/test.log
    яшчэ
    echo "$ дата: абноўлена" >> /home/user/logs/test.log
    рэха «———————————————» >> /home/user/logs/test.log
    fi

    Тэарэтычна гэта павінна быць нармальна, але ў рэчаіснасці ён не абнаўляецца, калі файл на спасылку ўжо існуе

    1.    спрытны сказаў

      прабачце, я бачыў, што ён не быў адпраўлены, і ён павялічыўся ўдвая