Условные инструкции в shell

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь использовать условные операторы в программировании на shell для принятия логических решений. Мы рассмотрим базовый синтаксис операторов if-else, а также то, как использовать числовые и строковые сравнения для оценки условий. К концу этого практического занятия вы сможете писать shell-скрипты, которые могут принимать решения на основе различных условий.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicSystemCommandsGroup -.-> linux/logical("Logic Operations") shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") subgraph Lab Skills linux/echo -.-> lab-388815{{"Условные инструкции в shell"}} shell/shebang -.-> lab-388815{{"Условные инструкции в shell"}} shell/comments -.-> lab-388815{{"Условные инструкции в shell"}} linux/logical -.-> lab-388815{{"Условные инструкции в shell"}} shell/variables_decl -.-> lab-388815{{"Условные инструкции в shell"}} shell/variables_usage -.-> lab-388815{{"Условные инструкции в shell"}} linux/chmod -.-> lab-388815{{"Условные инструкции в shell"}} linux/cd -.-> lab-388815{{"Условные инструкции в shell"}} shell/if_else -.-> lab-388815{{"Условные инструкции в shell"}} end

Создайте свою первую инструкцию if

Начнем с создания простой инструкции if, которая проверяет, равно ли значение переменной NAME строке "John".

Сначала откройте терминал в WebIDE. По умолчанию вы должны находиться в директории /home/labex/project. Если вы не уверены, всегда можно проверить текущую директорию с помощью команды pwd.

Создайте новый файл с именем if.sh с использованием следующей команды:

touch if.sh

Эта команда создает пустой файл с именем if.sh в текущей директории.

Теперь откройте файл if.sh в WebIDE. Для этого вы можете кликнуть на файл в проводнике файлов слева в WebIDE.

Добавьте следующее содержимое в файл:

#!/bin/bash

NAME="John"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
fi

Разберем этот скрипт по частям:

  1. #!/bin/bash: Это называется "шебанг" (shebang) строкой. Она сообщает системе, какой интерпретатор использовать для запуска скрипта. В данном случае мы используем Bash.
  2. NAME="John": Эта строка создает переменную с именем NAME и присваивает ей значение "John".
  3. if [ "$NAME" = "John" ]; then: Это начало нашей инструкции if. Она проверяет, равно ли значение переменной NAME строке "John".
    • Квадратные скобки [ ] на самом деле являются командой в Bash, эквивалентной команде test.
    • Мы заключаем "$NAME" в кавычки, чтобы обработать случаи, когда NAME может быть пустой или содержать пробелы.
    • Точка с запятой и then являются частью синтаксиса инструкции if в Bash.
  4. echo "The name is John": Эта строка будет выполнена, если условие истинно.
  5. fi: Это отмечает конец инструкции if. Это "if" наоборот!

Сохраните файл после добавления этого содержимого.

Теперь нам нужно сделать скрипт исполняемым. В системах на основе Unix файлы по умолчанию не являются исполняемыми по соображениям безопасности. Мы можем изменить это с помощью команды chmod:

chmod +x if.sh

Эта команда добавляет разрешение на выполнение файла. +x означает "добавить разрешение на выполнение".

Теперь запустите скрипт:

./if.sh

./ сообщает оболочке искать скрипт в текущей директории.

Вы должны увидеть вывод: The name is John

Если вы не видите этот вывод, перепроверьте, что вы сохранили файл с правильным содержимым и сделали его исполняемым.

Добавьте предложение else

Теперь расширим нашу инструкцию if, добавив предложение else. Это позволит нам указать, что должно произойти, когда условие ложно.

Откройте снова файл if.sh в WebIDE и измените его следующим образом:

#!/bin/bash

NAME="Alice"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
else
  echo "The name is not John"
fi

Рассмотрим внесенные изменения:

  1. Мы изменили значение переменной NAME на "Alice". Это сделано для демонстрации того, что происходит, когда условие ложно.
  2. Мы добавили предложение else. Это предложение определяет, что должно произойти, если условие в инструкции if ложно.
  3. После else мы добавили еще одну команду echo, которая будет выполнена, если NAME не равно "John".

Предложение else в инструкциях if является необязательным, но оно очень полезно, когда вы хотите выполнить какое - то конкретное действие, когда условие ложно, а не просто ничего не делать.

Сохраните файл с этими изменениями.

Теперь запустите скрипт снова:

./if.sh

На этот раз вы должны увидеть вывод: The name is not John

Это происходит потому, что значение NAME теперь равно "Alice", поэтому условие [ "$NAME" = "John" ] ложно, и выполняется код в блоке else.

Попробуйте изменить значение переменной NAME обратно на "John" и запустить скрипт снова. Какой вывод вы получите? Это хороший способ проверить, что ваша инструкция if - else работает корректно в обоих случаях.

Введение в elif

Иногда нам нужно проверить несколько условий. Именно здесь пригодится предложение elif (else if). Изменим наш скрипт, чтобы он обрабатывал несколько имен.

Обновите файл if.sh следующим содержимым:

#!/bin/bash

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
  echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
  echo "Ringo Starr"
else
  echo "Unknown member"
fi

Разберем этот скрипт по частям:

  1. Мы начинаем с NAME="George". Это имя, которое мы будем проверять.
  2. Первая инструкция if проверяет, равно ли имя "John".
  3. Если имя не "John", мы переходим к первой инструкции elif (else if), которая проверяет, равно ли имя "Paul".
  4. Если имя не "Paul", мы переходим к следующей инструкции elif и проверяем на "George".
  5. Если имя не "George", мы проверяем на "Ringo".
  6. Если ни одно из этих условий не истинно, мы попадаем в предложение else, которое выведет "Unknown member".

Предложение elif позволяет последовательно проверять несколько условий. Вы можете использовать столько предложений elif, сколько вам нужно. Условия проверяются по порядку, и для первого истинного условия будет выполнен соответствующий блок кода.

Сохраните файл с этими изменениями.

Теперь запустите скрипт:

./if.sh

Вы должны увидеть вывод: George Harrison

Попробуйте изменить значение переменной NAME на разные значения ("John", "Paul", "Ringo" или что - то совсем другое) и каждый раз запускайте скрипт. Обратите внимание, как меняется вывод в зависимости от значения NAME.

Числовые сравнения

Shell-скрипты также могут сравнивать числа. Создадим новый скрипт, чтобы продемонстрировать числовые сравнения.

Создайте новый файл с именем numeric.sh:

touch numeric.sh

Откройте файл numeric.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

NUMBER=10

if [ $NUMBER -lt 5 ]; then
  echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
  echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
  echo "The number is greater than 15"
else
  echo "The number is between 5 and 15, but not 10"
fi

В этом скрипте используются операторы числового сравнения:

  • -lt: меньше чем
  • -eq: равно
  • -gt: больше чем

Существуют и другие операторы, которые вы можете использовать:

  • -le: меньше или равно
  • -ge: больше или равно
  • -ne: не равно

Обратите внимание, что мы используем эти специальные операторы вместо символов, таких как < или >. Это связано с тем, что в Bash символы < и > используются для перенаправления ввода/вывода, а не для числового сравнения.

Теперь сделаем скрипт исполняемым и запустим его:

chmod +x numeric.sh
./numeric.sh

Вы должны увидеть вывод: The number is exactly 10

Попробуйте изменить значение переменной NUMBER на разные значения и запустите скрипт снова. Посмотрите, как меняется вывод в зависимости от установленного значения.

Например, если вы измените NUMBER на 20, вы должны получить "The number is greater than 15". Если вы измените его на 7, вы должны получить "The number is between 5 and 15, but not 10".

Сравнение строк и логические операторы

Наконец, давайте рассмотрим сравнение строк и логические операторы. Создайте новый файл с именем string_logic.sh:

touch string_logic.sh

Откройте файл string_logic.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10

if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
  echo "Both strings match"
fi

if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
  echo "At least one of the number conditions is true"
fi

if [[ "$STRING1"!= "$STRING2" ]]; then
  echo "The strings are different"
fi

if [[ -z "$STRING3" ]]; then
  echo "STRING3 is empty or not set"
fi

Этот скрипт демонстрирует несколько новых концепций:

  1. Сравнение строк на равенство (=): Это проверяет, совпадают ли две строки точно.
  2. Логическое И (&&): Этот оператор позволяет объединять два условия. Оба условия должны быть истинными, чтобы общее выражение было истинным.
  3. Логическое ИЛИ (||): Этот оператор также объединяет два условия, но только одно из них должно быть истинным, чтобы общее выражение было истинным.
  4. Сравнение строк на неравенство (!=): Это проверяет, различны ли две строки.
  5. Проверка, является ли строка пустой (-z): Это истинно, если строка пуста (имеет нулевую длину).

Также обратите внимание на использование двойных квадратных скобок [[ ]] в некоторых инструкциях if. Это усовершенствованная версия одинарных квадратных скобок, и их предпочтительно использовать в Bash-скриптах, если это возможно. Они позволяют использовать более сложные выражения и менее подвержены неожиданным эффектам при разделении слов и расширении имен путей.

Сделайте скрипт исполняемым и запустите его:

chmod +x string_logic.sh
./string_logic.sh

Вы должны увидеть вывод всех четырех команд echo, так как все условия в скрипте истинны.

Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not set

Попробуйте изменить некоторые значения (например, установить STRING1 в значение, отличное от "hello") и посмотрите, как это повлияет на вывод.

Итоги

В этом практическом занятии вы научились использовать условные инструкции в программировании на shell. Вы практиковались в использовании инструкций if-else, предложений elif, числовых сравнений, сравнений строк и логических операторов. Эти инструменты позволяют создавать более сложные и ориентированные на принятие решений shell-скрипты.

Основные выводы:

  • Базовая структура инструкций if-else в shell-скриптах
  • Как использовать elif для проверки нескольких условий
  • Операторы числового сравнения (-lt, -gt, -eq и др.)
  • Сравнение строк и логические операторы
  • Важность выполнения команды chmod для придания скриптам исполняемого статуса

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