Баш: Условия (ако-тогава-друго)

Здравейте

Този път ще ви покажа как да направите скрипт с условие в Тряскам, което в превод е:

Ако 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 АДРЕС по очевидно 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), A имаше такива проблем или грешка (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, който искат):

Тук можете да видите работещия скрипт:

% 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.    KZKG ^ Гаара каза той

      Не за нищо 😀
      Ако ви е послужило и е интересно, доволен съм 😉

      Поздрави приятел

  2.   надлежен каза той

    @ KZKG ^ Гаара,
    говорейки за баш програмиране имам въпрос:
    Каква е разликата между декларирането на променлива като тази 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 като null, следователно тя показва 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.   Leper_Ivan каза той

    Въпреки че минаха няколко дни от публикуването на тази тема, тя ми послужи много, след като направих скрипт на 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 "Да, в мрежата е"
        още
        ехо "Не е в мрежата"
        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.   Дарио каза той

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

    ехо "Въведете билет"
    четене -p билет

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

    Разбира се, че е ужасно и те се смеят ха-ха, но както казах, тепърва започвам с това.

    Ако обясня лошо, моля, кажете ми и се опитвам да се справя по-добре.

    Прегърнете всички.

  15.   Умберто Й. каза той

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

  16.   пъргав каза той

    Имам малко съмнения с if, else и други.
    Искам скрипт, който да провери дали файл съществува (един от регистрационните файлове) и ако не, да го създам и по-късно да запиша в него. Но ако съществува, искам просто да му пишете.

    Това, което имам е:

    дата = `дата -R`
    #Тествах променлива дата, която не се актуализира между началото на a
    #process и завършва, понякога може да мине един час и точният час не излиза.

    ако [-f /home/user/logs/test.log];
    след това
    докоснете /home/usuario/logs/test.log
    още
    echo "$ дата: Актуализирано" >> /home/user/logs/test.log
    ехо «————————————————» >> /home/user/logs/test.log
    fi

    На теория би трябвало да е добре, но реалността е, че не се актуализира, ако посоченият файл вече съществува

    1.    пъргав каза той

      съжалявам, видях, че не е изпратено и се е удвоило