Условные операторы в оболочке

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

Введение

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

Создайте свой первый оператор 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.

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

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

Создайте новый файл с именем 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: меньше чем (less than)
  • -eq: равно (equal to)
  • -gt: больше чем (greater than)

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

  • -le: меньше или равно (less than or equal to)
  • -ge: больше или равно (greater than or equal to)
  • -ne: не равно (not equal to)

Обратите внимание, что мы используем эти специальные операторы вместо таких символов, как < или >. Это связано с тем, что в 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 se

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

Резюме

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

Ключевые выводы:

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

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