Баш: умови (якщо-то-інше)

привіт

Цього разу я покажу вам, як створити сценарій з умовою в Удар, що в перекладі:

Якщо X, що ви хочете, виконано, виконується дія Y, якщо не виконано, то виконується інша дія.

Просте пояснення немає 😀

Зараз я кілька хвилин думав про якийсь приклад для використання в цьому підручнику, і мені спала на думку така дилема / проблема / ситуація:

Ми знаходимось у мережі нашої компанії, і ми хочемо знати, чи підключений комп’ютер X до мережі. Для цього ми робимо a сценарій що він буде робити пінг до цього комп'ютера, і якщо він знаходиться в мережі (тобто якщо він повертає файл пінг) скаже нам, що ТАК, це в мережі, інакше (тобто його немає в мережі) він скаже нам, що НЕ в мережі.

Після того, як це буде зроблено, зараз я поясню, як робити цикл з умовами 🙂

Ось код:

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: Як створити виконуваний сценарій

Тоді давайте скопіюємо наступний код у цей файл (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-адресу, яку вони хочуть):

Тут ви можете побачити запущений сценарій:

% КОД 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%

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

Це щось елементарне, просте так, але все-таки я намагався це пояснити якомога краще, тому що не кожен має душу програміста, і багато разів нам потрібно робити такі сценарії (або подібні), у будь-якому випадку я сподіваюся, ця стаття комусь стане в нагоді 🙂

Будь-які сумніви чи запитання, скарги чи пропозиції, будь ласка, залиште тут, я з радістю відповім вам, і отже, ми всі дізнаємось трохи більше 😀

привіт


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  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 нульовою, тому вона відображає value_default.

    Привіт.

    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
    #! / бін / баш
    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:

        якщо ping -c 1 IP-АДРЕСА; тоді
        echo "Так, це в мережі"
        ще
        echo "Не в мережі"
        fi

        Що трапляється, це те, що якщо обчислює значення повернення команди, яку ви передаєте як аргумент, якщо вона повертає 0, це істина, все інше є помилковим. Квадратні дужки еквівалентні команді тесту. Але ви можете передати будь-яку команду як аргумент (якщо команда повертає якесь значення).

  10.   привіт - сказав він

    Привіт, як мені виконати script.sh з користувачем X у сценарії, в якому я створюю користувача Y, і цей користувач Y продовжує виконувати script.sh

    Чи можна це зробити ??

  11.   Куктос - сказав він

    Дуже цікаво, дякую!

  12.   Франциско - сказав він

    Дякую за внесок, я провів годину, щоб зрозуміти це xD, але я зрозумів це !!!!.

  13.   Елой - сказав він

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

  14.   Dario - сказав він

    Привіт, я дуже новачок у цьому, я намагаюся зробити номер квитка (буквено-цифровий) за допомогою прочитаного, і я хочу, щоб якщо те, що введено, має правильний формат (ABC-123456), виконати команду "x", і я не ' я не знаю, як це зробити, чи не могли б ви мені допомогти?

    луна "Введіть квиток"
    читати -p квиток

    якщо $ квиток = "не маю ідеї (формат ABC-123456"); потім cp file.txt $ квиток; else echo "неправильний формат, спробуйте ще раз"; читати -p; fi.

    Звичайно, це жахливо, і вони сміються ха-ха, але, як я вже сказав, я тільки починаю з цього.

    Якщо я поясню погано, будь ласка, скажіть мені, і я намагаюся зробити краще.

    Обняти всіх.

  15.   Гумберто Ю. - сказав він

    Відмінне пояснення, вітаю

  16.   моторний - сказав він

    Я трохи сумніваюся щодо if, else та інших.
    Я хочу, щоб сценарій перевіряв, чи існує файл (один із журналів), а якщо ні, то створював його та пізніше записував у нього. Але якщо він існує, я хочу, щоб ви просто написали йому.

    Що у мене є:

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

    якщо [-f /home/user/logs/test.log];
    потім
    торкніться /home/usuario/logs/test.log
    ще
    echo "$ дата: оновлено" >> /home/user/logs/test.log
    echo «————————————————» >> /home/user/logs/test.log
    fi

    Теоретично це має бути добре, але реальність така, що він не оновлюється, якщо посилання на файл уже існує

    1.    моторний - сказав він

      вибачте, я бачив, що його не надіслали, і він збільшився вдвічі