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-адресу ПК, который мы хотим проверить.

Как видите, я поставил «-c 1«, Который нам нужен. Когда мы пингуем компьютер, это действие не прекращается (пинг), пока мы не нажмем на себя [Ctrl] + [C], поэтому положив «-c 1»Мы советуем вам выполнять только одну проверку (только одну попытку ping) и никакой другой, это приведет к немедленной остановке, то есть ... она проверит, находится ли компьютер в сети только один раз.

Если у вас есть сомнения по этому поводу, без боли ... они так говорят и я с радостью вам еще раз объясню 😉

Теперь наступает цикл, потому что то, что я только что объяснил, - не более чем обычная команда / действие action

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: Как создать исполняемый скрипт

Затем давайте скопируем следующий код в этот файл (скрипт.sh), а в конце скажем «выход»(Без кавычек):

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

Это должно выглядеть так (помните, что они должны были изменить IP-АДРЕС на тот, который им нужен):

Здесь вы можете увидеть запущенный скрипт:

% CODE1%

Как видите, в конце он говорит нам «Да это в сети»🙂

Здесь важно то, что они действительно понимают эти условия, поэтому я оставляю вам другой код, чтобы объяснить это снова, но с другой точки зрения.

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

Вот как работает скрипт:

% CODE2%

И что ж ... больше нечего добавить.

Это что-то элементарное, простое, да, но все же я попытался объяснить это как можно лучше, потому что не у всех есть душа программиста, и много раз нам нужно создавать такие скрипты (или подобные), в любом случае я надеюсь, что эта статья будет вам полезна кто-то 🙂

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

привет


Оставьте свой комментарий

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

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

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

    Вы профи !!! *или же*

    1.    КЗКГ ^ Гаара сказал

      Нет, зря
      Если это послужило вам и это интересно, я доволен 😉

      Привет друг

  2.   правильный сказал

    @ КЗКГ ^ Гаара,
    говоря о программировании на bash, у меня есть вопрос:
    В чем разница между объявлением переменной типа VAR = hello и объявлением переменной VAR = $ {VAR: -hello}?

    Я объясняю:
    http://pastebin.com/a3cfWXeD

    привет 😉

    1.    КЗКГ ^ Гаара сказал

      привет
      Ну, я вообще не эксперт в bash ... вообще-то, я понятия не имею, LOL !!
      Когда я объявляю переменные, это выглядит так:
      : ${OPTFOLDER:="/opt/"}

      Но поскольку я всегда так делал, честно говоря, я не знаю, в чем может быть разница 🙁

  3.   правильный сказал

    @ KZKG ^ Гаара
    Я задал вопрос, потому что правда в том, что я тоже не знал, я обычно пишу SlackBuilds, и правда в том, что переменные, объявленные как в VAR1, изобилуют в этих скриптах. Быстрый поиск в Google помог мне прояснить этот вопрос, я делюсь им со всеми, чтобы мы все могли узнать:

    Автор сценария:
    http://pastebin.com/faAQb35w

    объяснение:
    Объявление переменных вида VAR = $ {VAR: -default_value} означает, что переменная VAR будет принимать значение default_value тогда и только тогда, когда значение равно нулю или не существует.

    Практический пример:
    При выполнении сценария предлагается ввести значение, которое будет сохранено в переменной VAR, если что-то введено, будет показано, что было введено. Если мы ничего не вводим и нажимаем Enter, мы объявляем переменную VAR как null, поэтому она показывает value_default.

    Привет.

    1.    КЗКГ ^ Гаара сказал

      ХАХА, я этого не знал 😀
      Хорошо, большое спасибо, друг ... вот что я имел в виду в конце статьи, я не собираюсь чему-то учить и все, я знаю, что я всегда узнаю здесь что-то новое 😀

      Приветствую и еще раз спасибо.

      1.    правильный сказал

        Вы правы, здесь можно узнать несколько вещей.

        привет и счастливых праздников !! 😀

  4.   Лукас Матиас сказал

    Очень хорошо и прекрасно объяснено +1, время, которое вам потребовалось ...
    но я того стою

    1.    КЗКГ ^ Гаара сказал

      На самом деле я написал 80% всего за 1 день, у меня ушло так много времени, чтобы опубликовать это только потому, что мой интернет не позволял мне.
      Спасибо за комментарий 😉

  5.   Хьюго сказал

    Другой способ сделать это - использовать DNS, поскольку иногда в сетях блокируется протокол ICMP:

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

    Вы также заметите, что в этом примере проверка возвращаемого значения неявная 😉

    1.    КЗКГ ^ Гаара сказал

      Вы, как всегда, друг, с советами, которые я не знаю полностью ХАХАХА.
      Спасибо, комментарий ценится и хе-хе ... еще одна новинка, которую я узнал 😀

  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 up

  9.   Авраам сказал

    потому что если сравнивать с вопросительным знаком? какая разница между ставить? любое другое письмо

    1.    КЗКГ ^ Гаара сказал

      $? означает «предыдущий вывод или вывод», то есть в случае, если результат предыдущей команды ... 🙂

      1.    Эндрю сказал

        Есть другой способ достичь того же результата, передав команду ping напрямую в качестве аргумента if:

        если ping -c 1 IP-АДРЕС; тогда
        echo "Да, это в сети"
        еще
        echo "Не в сети"
        fi

        Что происходит, так это то, что if оценивает возвращаемое значение команды, которую вы передаете в качестве аргумента, если оно возвращает 0, это правда, все остальное ложно. Квадратные скобки эквивалентны тестовой команде. Но вы можете передать любую команду в качестве аргумента (если команда возвращает какое-то значение).

  10.   привет сказал

    Здравствуйте, как мне выполнить script.sh с пользователем X в сценарии, который я создаю пользователя Y, и этот пользователь Y продолжает выполнение script.sh

    Можно ли это сделать ??

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

    Очень интересно, спасибо!

  12.   Франциско сказал

    Спасибо за вклад, у меня был час, чтобы понять это xD, но я это понял !!!!.

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

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

  14.   Дарио сказал

    Здравствуйте, я новичок в этом, я пытаюсь сделать номер билета (буквенно-цифровой) с помощью чтения, и я хочу, чтобы, если введенное имело правильный формат (ABC-123456), выполняло команду "x", а я этого не делаю. Не знаю, как это сделать, не могли бы вы мне помочь?

    эхо "Введите билет"
    читать -p билет

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

    Конечно, это ужасно, и они смеются, ха-ха, но, как я уже сказал, я только начинаю с этого.

    Если я объясню плохо, скажите мне, и я постараюсь сделать лучше.

    Обними всех.

  15.   Умберто Y сказал

    Отличное объяснение, привет

  16.   Агиль сказал

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

    Что у меня есть:

    date = `дата -R`
    # Я тестировал дату переменной, которая не обновляется между началом
    #process and заканчивается, иногда проходит час, а правильное время не выходит.

    если [-f /home/user/logs/test.log];
    тогда
    коснитесь /home/usuario/logs/test.log
    еще
    echo "$ date: Обновлено" >> /home/user/logs/test.log
    echo «———————————————-» >> /home/user/logs/test.log
    fi

    Теоретически это должно быть хорошо, но на самом деле он не обновляется, если указанный файл уже существует.

    1.    Агиль сказал

      извините, я увидел, что оно не отправлено и оно увеличилось вдвое