Введение

В этой лабораторной работе мы изучим функции shell в Linux. Функции shell — это переиспользуемые блоки кода, которые выполняют определенные задачи, делая наши скрипты более организованными и эффективными. Мы научимся создавать, вызывать и использовать функции с параметрами в shell-скриптах. Эта работа предназначена для начинающих, поэтому мы будем двигаться шаг за шагом и подробно объяснять каждую концепцию.

Создание вашей первой функции Shell

Начнем с создания простой функции shell. Функции в shell подобны мини-скриптам внутри основного скрипта, позволяя группировать команды, выполняющие конкретную задачу.

Сначала нам нужно создать новый файл. Откройте терминал и введите:

cd ~/project
touch functions.sh

Эта команда переходит в каталог project и создает новый файл с именем functions.sh. В этом файле будут храниться наши функции.

Теперь добавим нашу первую функцию:

#!/bin/bash

## Это простая функция
greet() {
  echo "Hello, World!"
}

## Эта строка вызывает (запускает) функцию
greet

Разберем этот код:

  • Первая строка #!/bin/bash называется шебанг (shebang). Она указывает системе использовать bash для интерпретации этого скрипта.
  • Мы определяем функцию с помощью greet() { }. Все, что находится внутри фигурных скобок, является частью функции.
  • Внутри функции находится простая команда echo, которая выводит "Hello, World!".
  • Последняя строка greet вызывает (запускает) нашу функцию.

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

chmod +x functions.sh
./functions.sh

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

Hello, World!

Если вы не видите этот вывод, дважды проверьте, правильно ли вы ввели все данные в файле functions.sh.

Функции с параметрами

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

Снова откройте файл functions.sh и замените его содержимое следующим кодом:

#!/bin/bash

## Функция с одним параметром
greet() {
  echo "Hello, $1!"
}

## Функция с несколькими параметрами
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## Вызов функций с аргументами
greet "Alice"
calculate 5 3

Изучим этот код:

  • В функции greet переменная $1 ссылается на первый аргумент, переданный функции.
  • В функции calculate переменные $1 и $2 ссылаются на первый и второй аргументы соответственно.
  • Конструкция $(($1 + $2)) выполняет арифметическое сложение двух параметров.

Запустите скрипт:

./functions.sh

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

Hello, Alice!
The sum of 5 and 3 is 8

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

Возвращаемые значения из функций

В shell-скриптах функции не возвращают значения так же, как в других языках программирования. Вместо этого они могут либо выводить результат через echo (который можно перехватить), либо изменять глобальную переменную. Рассмотрим оба метода.

Снова откройте functions.sh и обновите содержимое следующим кодом:

#!/bin/bash

## Функция, которая выводит результат через echo
get_square() {
  echo $(($1 * $1))
}

## Функция, которая изменяет глобальную переменную
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## Перехват выведенного результата
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## Использование функции для изменения глобальной переменной
set_global_result 6
echo "The square of 6 is $RESULT"

Разберем по порядку:

  • Функция get_square использует echo для вывода результата, который мы перехватываем с помощью синтаксиса $().
  • Функция set_global_result напрямую изменяет глобальную переменную RESULT.
  • Мы используем $() для записи вывода get_square в переменную.
  • Мы вызываем set_global_result, которая обновляет RESULT, а затем выводим значение RESULT.

Сохраните файл и запустите его:

./functions.sh

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

The square of 5 is 25
The square of 6 is 36

Если результат отличается, проверьте functions.sh на наличие опечаток.

Понимание области видимости переменных

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

Изменим наш файл functions.sh, чтобы продемонстрировать эту концепцию.

Обновите содержимое следующим кодом:

#!/bin/bash

## Глобальная переменная
GLOBAL_VAR="I'm global"

## Функция с локальной переменной
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## Вызов функции
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

Вот что происходит в этом скрипте:

  • Мы определяем глобальную переменную GLOBAL_VAR.
  • Внутри функции demonstrate_scope мы определяем локальную переменную LOCAL_VAR с помощью ключевого слова local.
  • Мы выводим обе переменные внутри функции.
  • После вызова функции мы пытаемся снова вывести обе переменные уже вне функции.

Сохраните файл и запустите его:

./functions.sh

Вы должны увидеть вывод, похожий на этот:

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

Обратите внимание, что LOCAL_VAR пуста при обращении к ней вне функции. Это происходит потому, что локальные переменные доступны только внутри той функции, где они были определены.

Продвинутая функция — ENGLISH_CALC

Теперь, когда мы изучили основы функций shell, давайте создадим более сложную функцию под названием ENGLISH_CALC. Эта функция будет принимать три аргумента: два числа и операцию (plus, minus или times).

Замените содержимое файла следующим кодом:

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## Тестирование функции
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## Это должно вывести сообщение об ошибке

Разберем работу этой функции:

  • Мы используем переменные local для хранения входных данных и результатов. Это хорошая практика, позволяющая избежать конфликтов с глобальными переменными.
  • Мы используем оператор case для обработки различных операций. Это похоже на оператор switch в других языках программирования.
  • Для каждой допустимой операции мы выполняем расчет и выводим результат.
  • Если указана недопустимая операция, мы выводим сообщение об ошибке и возвращаем 1 (в shell-скриптах ненулевое возвращаемое значение указывает на ошибку).
  • В конце мы тестируем нашу функцию с различными входными данными, включая неверную операцию.

Сохраните файл и запустите его:

./functions.sh

Вы должны увидеть следующий вывод:

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

Если вы не видите этого вывода, проверьте файл functions.sh на наличие опечаток.

Резюме

В этой лабораторной работе мы изучили функции shell в Linux, пройдя путь от основ до более продвинутых концепций. Мы научились:

  1. Создавать и вызывать простые функции.
  2. Работать с параметрами функций.
  3. Возвращать значения из функций с помощью echo и глобальных переменных.
  4. Понимать область видимости переменных и использовать локальные переменные.
  5. Создавать сложные функции для обработки арифметических операций.

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

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