Как использовать if-else в сценариях оболочки
4 января, 2023 11:59 дп 29 views | Комментариев нетDevelopment | Amber | Комментировать запись
В продолжение предыдущего мануала по сценариям оболочки сегодня мы разберем работу if-else в shell-скриптах.
Читайте также: Аргументы командной строки в shell-скриптах
Условное ветвление — важная часть любого языка программирования, потому что обычно нежелательно выполнять абсолютно все операторы, присутствующие в программе.
Чтобы избежать этого, нам нужен способ условного выполнения операторов, и оператор if-else в сценариях оболочки служит именно для этого.
Условия в сценариях оболочки
Операторы if-else являются важной частью условного ветвления. if-else позволяют выполнять итеративные условные операторы в коде.
С помощью if-else в сценариях можно оценить условие, а затем, исходя из результата, выполнить один из нескольких доступных наборов операторов.
По сути это позволяет выбрать ответ на результат, который выдается условным выражением.
Как работает if-else в сценариях оболочки?
Мы разобрали функцию if-else и то, почему она важна для каждого программиста. Теперь давайте посмотрим на работу условной функции, чтобы понять if-else в сценариях оболочки.
Посмотрим на синтаксис условного блока в if-else.
if [condition] then statement1 else statement2 fi
Здесь использованы четыре ключевых слова: if, then, else и fi.
- За ключевым словом if следует оператор.
- condition оценивается, чтобы решить, какое утверждение будет выполняться процессором.
- Если condition равен TRUE, процессор выполнит утверждение, которое следует за ключевым словом then. В синтаксисе оно упоминается как condition1.
- Когда условие равно FALSE, процессор выполнит утверждение ключевого слова else. В синтаксисе функции это обозначается как condition2.
Важно помнить, что сценарии оболочки чувствительны к регистру, как и на языке C. Поэтому нужно быть внимательным при использовании ключевых слов в коде.
Практические примеры
Обычно вам достаточно увидеть синтаксис функции, чтобы понять, как ее использовать. Но всегда лучше разобрать функцию на примерах, потому что они демонстрируют роль разных ее аспектов.
Ниже мы рассмотрим несколько полезных примеров if-else в сценариях оболочки.
Перед вами список полезных команд:
- && – логическое AND
- $0 – аргумент 0, то есть команда, которая используется для запуска скрипта.
- $1 – первый аргумент (измените номер, чтобы получить доступ к дополнительным аргументам)
- -eq – проверка на равенство
- -ne – проверка неравенства
- -lt – меньше, чем
- -le – меньше или равно
- -gt – больше, чем
- -ge – больше или равно
1: if-else для проверки равенства двух чисел
Лучше начать с простого, чтобы понять работу функции if-else в сценарии оболочки. Инициализируем две переменные — a и b, — а затем с помощью функции if-else проверим их равенство. Для этой задачи сценарий bash должен выглядеть следующим образом:
#!/bin/bash m=1 n=2 if [ $n -eq $m ] then echo "Both variables are the same" else echo "Both variables are different" fi
Получим следующий вывод:
Both variables are different
2: if-else для сравнения двух значений
Сравнение двух значений — распространенное использование if-else в сценариях оболочки. В скриптах вы часто будете сравнивать одну переменную с другой переменной или фиксированным значением.
Давайте инициализируем две переменные и с помощью функции if-else найдем, чье значение больше.
#!/bin/bash a=2 b=7 if [ $a -ge $b ] then echo "The variable 'a' is greater than the variable 'b'." else echo "The variable 'b' is greater than the variable 'a'." fi
Получим вывод:
The variable 'b' is greater than the variable 'a'.
3: if-else для проверки четности числа
Оператор modulus делит число и возвращает остаток.
Как вы знаете, все четные числа кратны 2, поэтому с помощью следующего сценария оболочки мы сможем проверить четность/нечетность числа.
#!/bin/bash n=10 if [ $((n%2))==0 ] then echo "The number is even." else echo "The number is odd." fi
Вывод будет следующим:
The number is even
Мы взяли часть условия в двойные скобки, чтобы операция по модулю выполнялась до проверки условия.
4: if-else для подсказки пароля
Функция if-else известна своей универсальностью и широтой применения. В этом примере с помощью if-else в сценарии оболочки мы создадим интерфейс для запроса пароля.
Для этого попросим пользователя ввести пароль и сохранить его в переменной pass.
Если он совпадет с предварительно заданным паролем, который в данном примере является ‘password’, пользователь получит сообщение – “The password is correct”.
В противном случае сценарий оболочки сообщит, что пароль неверный, и попросит повторить попытку.
#!/bin/bash echo "Enter password" read pass if [ $pass="password" ] then echo "The password is correct." else echo "The password is incorrect, try again." fi
Подводим итоги
Функция if-else в сценариях оболочки дает программистам множество преимуществ. Это лучший инструмент для выполнения необходимого набора операторов на основе заранее определенных условий.
Поэтому блок if-else — одна из самых важных частей условного ветвления. При выполнении определенных операторов код будет более эффективным, а еще вы сэкономите время, которое процессор тратил бы впустую на выполнение ненужных для конкретного случая операторов.
Решение для ошибки MySQL-запроса IF EXISTS UPDATE ELSE INSERT
- Связанные таблицы в MySQL
- Ошибка при использовании MySQL-запроса
IF EXISTS UPDATE ELSE INSERT
- Альтернативный MySQL-запрос для обновления или добавления записи в таблицу со связанным полем с другой таблицей
- Пример MySQL-запроса использования связанных таблиц по ключу.
Связанные таблицы в MySQL.
При работе со связанными таблицами, когда требуется создать новую запись в связанной таблице, если её ещё нет и обновить поля в этой записи, если она уже есть, требуется написать MySQL-запрос , выполняющий данные условия. Однако, при работе со связанными таблицами InnoDB
могут возникнуть проблемы в виде ошибки корректности использования условного оператора IF
, а также проверки EXISTS
. Решая данную задачу, я пришёл к выводу, что нужно использовать конструкцию ON DUPLICATE KEY UPDATE
, которая решает данную задачу без ошибок.
Ошибка при использовании MySQL-запроса
IF EXISTS UPDATE ELSE INSERT
Итак, имеем две таблицы. Основная tableA
и связанная с ней tableВ
по полю id
. Казалось бы логично описать логику работы следующим SQL-запросом:
INSERT INTO `tableB` (`id`,`var_1`,`var_2`) VALUES ('тут id ключа','значение1','значение2') // и это отработает, если id в таблице tableB ещё нет ON DUPLICATE KEY UPDATE //а то, что ниже, просто обновит запись, содержащую id `var_1` = 'значение1', `var_2` = 'значение2'
Но, при попытке выполнить такой SQL-запрос сыплются ошибки и жалобы, то на неправильное применение условного оператора IF
, то какие-то проблемы рядом с проверкой EXISTS
. Все попытки привести данный запрос к работающему виду у меня не привели ни к какому результату. Поэтому вместо него я попробовал другую конструкцию SQL-запроса, выполняющего эту же логику, но без ошибок отрабатывающего необходимые действия.
Альтернативный MySQL-запрос для обновления или добавления записи в таблицу со связанным полем с другой таблицей
Итак, вся эта задача сводится к тому, чтобы в связанной таблице tableВ
содержались записи с уникальными ключами id
. И если в ней уже есть запись с этим ключом, то не создавать ещё одну запись, а обновить поля в имеющейся. Используем следующий SQL-запрос, содержащий функцию работы с ключами ON DUPLICATE KEY UPDATE
:
INSERT INTO `tableB` (`id`,`var_1`,`var_2`) VALUES ('тут id ключа','значение1','значение2') // и это отработает, если id в таблице tableB ещё нет ON DUPLICATE KEY UPDATE //а то, что ниже, просто обновит запись, содержащую id `var_1` = 'значение1', `var_2` = 'значение2'
И этот запрос обрабатывается правильно.
Пример MySQL-запроса использования связанных таблиц по ключу
Обычно в связанной таблице хранятся какие-то счётчики, и логику их работы можно выполнять не скриптом, а непосредственно в запросе, используя базу данных, поэтому последние две строчки могут выглядеть так:
`var_1` = `var_1` + 'значение1', `var_2` = `var_2` + 'значение2'
Таким образом, можно разгрузить основную таблицу tableA
, не храня значения счётчиков в ней, а вынести эти счётчики в отдельную связанную по ключу таблицу tableB
. И дело не только в том, что в основной таблице станет меньше полей, а ещё и в том, что если для работы требуется чаще значения счётчиков, то и запросы в более короткой таблице, содержащие значения этих счётчиков будут получены быстрее и проще.
Мне это понадобилось для разделения таблицы, содержащей список транзакций пользователей (tableA
) и таблицы, содержащей состояние счёта пользователей (tableB
) при написании биллинга на сайте, работающем на CMS Joomla. Но данное решение может быть нужно и для массы других задач, которые требуют раздельного хранения суммарных значений по конкретным позициям какого-либо объекта.
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Выберите, то, чем пользуетесь чаще всего:
оператор if — MySQL IF ELSEIF в запросе выбора
спросил
Изменено 6 лет назад
Просмотрено 371 тысяч раз
Я пытаюсь выбрать разные цены продукта в зависимости от количества, которое выбирает пользователь. Это запрос, над которым я работаю (у него синтаксическая ошибка):
выберите идентификатор, (ВЫБИРАТЬ ЕСЛИ(кол-во_1<='23',цена,1) ELSEIF(('23'>qty_1 && qty_2<='23'),price_2,1) ELSEIF(('23'>qty_2 && qty_3<='23'),price_3,1) ELSEIF('23'>кол-во_3,цена_4,1) END IF) в целом из продукта;
- MySQL
- оператор if
1
У вас есть то, что вы использовали в хранимых процедурах, подобных этой, для справки, но они не предназначены для использования так, как сейчас. Вы можете использовать IF
как показано сумраквафф
. Но оператор Case
лучше для глаз. Вот так:
выберите идентификатор, ( СЛУЧАЙ КОГДА количество_1 <= '23' ТОГДА цена КОГДА '23' > qty_1 && qty_2 <= '23' THEN price_2 КОГДА '23' > qty_2 && qty_3 <= '23' THEN price_3 КОГДА '23' > количество_3, ТО цена_4 ИНАЧЕ 1 КОНЕЦ) КАК всего из продукта;
Выглядит чище. Я полагаю, вам не нужна внутренняя ВЫБЕРИТЕ
в любом случае..
2
IF()
в MySQL является тернарной функцией, а не управляющей структурой — если условие в первом аргументе верно, возвращается второй аргумент; в противном случае возвращается третий аргумент. Нет соответствующей функции ELSEIF()
или ключевого слова END IF
.
Ближайшим эквивалентом того, что у вас есть, будет что-то вроде:
IF(qty_1<='23', price, ЕСЛИ('23'>кол-во_1 && кол-во_2<='23', цена_2, ЕСЛИ('23'>кол-во_2 && кол-во_3<='23', цена_3, ЕСЛИ('23'>кол-во_3, цена_4, 1) ) ) )
Не все условия мне понятны (похоже, некоторые из них могут быть непреднамеренно изменены на противоположные?), но, не зная, чего именно вы пытаетесь достичь, мне трудно это исправить.
2
Я обнаружил ошибку в MySQL 5.1.72 при использовании вложенных функций if() …. значение переменных столбца (например, qty_1) пусто во втором if(), что делает его бесполезным. Вместо этого используйте следующую конструкцию:
чехол когда qty_1<='23' тогда цена когда '23'>qty_1 && qty_2<='23', то price_2 когда '23'>qty_2 && qty_3<='23', то price_3 когда '23'>кол-во_3, тогда цена_4 еще 1 конец
На ваш вопрос:
ВЫБЕРИТЕ id, ЕСЛИ(кол-во_1 <= '23', цена, ЕСЛИ(('23' > qty_1 && qty_2 <= '23'), price_2, ЕСЛИ(('23' > кол-во_2 && кол-во_3 <= '23'), цена_3, ЕСЛИ(('23' > кол-во_2 && кол-во_3<='23'), цена_3, IF('23' > qty_3, price_4, 1))))) как итог ИЗ продукта;
Вы можете использовать управляющую структуру if-else
или функцию IF
в MySQL.
Ссылка:
http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/
1
Согласно ответу Науфала, операторы IF должны быть в процедуре. Я нашел этот пост, который показывает блестящий пример использования вашего скрипта в процедуре во время разработки и тестирования. По сути, вы создаете, вызываете и удаляете процедуру:
https://gist.github.com/jeremyjarrell/6083251
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Операторы MySQL If-Then
Объявление ‘IF’ часто используется в сохраненных программах в MySQL, которые применяют простую условную конструкцию. Оператор IF-THEN позволяет выполнять ряд операторов SQL на основе заданного условия. Это дает True, False или NULL в качестве одного из трех значений. В этом руководстве мы поймем, как обработать часть команды SQL относительно заданного условия с помощью оператора MySQL IF-then.
Синтаксис:
>> IF условие THEN операторы END IF;
В следующем синтаксисе:
- ЕСЛИ: Это’ ключевое слово для запуска условия.
- Условие : После предложения «IF» необходимо выполнить ограничение.
- Заявления : Может быть любой частью кода, например, выбрать, получить, обновить, удалить. Если условие оценивается как ИСТИНА, то будут выполнены операторы после предложения «THEN».
- ENDIF: Это конец предложения «IF». После него власть переносится на следующий пункт.
Давайте начнем разбираться, если-то, запустив командную оболочку MySQL. Введя пароль, мы готовы к работе.
Пример 01: Функция MySQL IF():
Чтобы узнать об операторе If, мы должны сначала протестировать функцию IF(). В приведенном ниже примере мы определили функцию IF() в запросе SELECT и дали ей условие, чтобы проверить, больше ли 2, чем 9.или нет. Если условие допустимо, оно вернет первое значение после условия; иначе второй. Поскольку наше условие недействительно, поэтому оно возвращает «ложь».
Предположим, что таблица «порядок» показана на прилагаемом изображении.
>> ВЫБРАТЬ * ИЗ data.order;
Давайте посмотрим на функцию IF(), выполняемую для этой таблицы. Мы выбрали три столбца. Если столбец «Статус» имеет значение «Оплачено», то метод IF() вернет «Отлично», в противном случае — «Плохо». Возвращаемое значение функции IF() будет сохранено во вновь созданном во время выполнения столбце «Примечания». Теперь мы можем видеть вывод, как показано ниже.
Пример 02: Оператор MySQL IF-THEN
Мы попробовали функцию IF() в командной строке MySQL. Давайте попробуем новый пример оператора IF-Then в графическом интерфейсе MySQL при использовании процедур. Откройте MySQL Workbench 8.0 и сначала подключитесь к базе данных.
Мы работали над базой данных «данные»; затем вы должны указать команду «использовать данные», чтобы использовать ее в Workbench. Нажмите значок вспышки, чтобы выполнить его. Вы должны знать, что операторы If-then работают с процедурами хранения, как показано ниже. Мы объявили разделитель ключевых слов для запуска процедуры сохранения. Процедура myResult принимает два аргумента. После оператора BEGIN у нас есть оператор IF, который проверяет условие. Если условие выполняется, то будет выполнена команда «THEN» и ее следующий оператор. Если условие становится ложным, то будут реализованы операторы после «END IF».
Поскольку процедура myResult принимает два аргумента, мы должны передать ей два значения.
После передачи значений в процедуру хранения мы должны вызвать процедуру, чтобы увидеть результаты оператора If-then.
Результат приведен ниже. Он вычислил Discount_rate с помощью оператора If-then.
Если вы хотите снова использовать ту же хранимую процедуру, вы должны сначала удалить эту процедуру с помощью приведенной ниже команды DROP, а затем выполнить ее снова.
Пример 03. Оператор MySQL IF-THEN-ELSE
Давайте перейдем к более широкому уровню. На этот раз мы рассмотрим оператор IF-Then-Else, используя хранимую процедуру в нашем примере. Взгляните на приведенную ниже таблицу «студент» с некоторыми полями.
>> SELECT * FROM data.student;
Прежде всего, вы должны использовать базу данных «данные», чтобы использовать таблицу «студент» в нашей процедуре хранения. Для этого введите приведенную ниже команду в терминале командной строки MySQL.
>> использовать данные;
Теперь объявите разделитель, а затем начните писать процедуру сохранения. Команда CREATE будет использоваться для объявления или создания процедуры, как обычно. Процедура «details» принимает два аргумента. После этого процедура сохранения начинается с ключевого слова BEGIN. Слово «DECLARE» использовалось для определения переменной «Sub» для субъектов. Запрос «SELECT» использовался для выбора значений столбца «Subject» из таблицы «student» и сохранения их во вновь объявленной переменной «Sub». Предоставленное пользователем значение «S_Subject» будет сравниваться со значением столбца «Subject». В операторе «IF», если предоставленное пользователем значение «S_Subject» совпадает со значением столбца «Subject», тогда будет выполнен относительный оператор «THEN» вместе с его операторами внутри. Эта процедура будет обрабатываться от первого оператора «IF» ко второму, а затем к третьему оператору «ELSEIF». Если последняя часть «ELSEIF» не совпадает со значением, предоставленным пользователем, управление будет передано оператору «END IF».
Давайте завершим разделитель приведенной ниже командой.
Мы должны вызвать процедуру хранения, выполнив ее с запросом CALL и аргументами в скобках.