При написании сложных сценариев в bash, разделение сценариев на более мелкие модули (функции) облегчает понимает и позволяет и позволяет повторно использовать эти модули.
Создание bash функции
Для создания (объявления) функции необходимо использовать следующий формат
1 2 3 | function <function-name> { # body } |
Ключевое слово function перед именем функции является необязательным. Чтобы быть совместимым с POSIX, имя функции bash не может содержать никаких символов, кроме букв, цифр и знаков подчеркивания, и не может начинаться с цифры.
Вызов bash функции
Как только функция bash определена, можно ее вызвать в сценарии. В bash нужно определить функцию перед ее вызовом, функция должна быть выше по тексту сценария чем ее вызов. В противном случае вы увидите ошибку "command not found". Для вызова функции достаточно использовать в тексте сценария ее имя.
1 2 3 4 5 | function test { echo "Hello world" } test # run |
В результате работы сценария в консоль будет выведен текст "Hello world"
Создание локальной переменной в bash функции
Для создания локальной переменной, которая видна (возможно использовать) только внутри функции используется параметр local перед вызовом переменной
1 2 3 4 5 6 7 8 | best="Linux" function test { local best="Windows" echo "$best is a window" } test echo "$best is the best" |
в результате в скрипт вернет:
1 2 | Windows is a window Linux is the best |
Передача аргументов (параметров) в функцию bash
Во многих сценариях необходимо передать некоторые аргументы функции bash. С точки зрения передачи аргументов функция bash ведет себя аналогично обычному bash скрипту. Таким образом, когда функции передаются параметры, на эти параметры ссылаются внутри функции так же, как на позиционные параметры, передаваемые сценарию bash из командной строки.
Например, на первый параметр ссылается $1, на второй параметр - $2 и т. д.
1 2 3 4 5 6 | function test { echo "First: $1" echo "Second: $2" } test "Hello world!" 1 |
В результате функция вернет следующий текст
1 2 | First: Hello world! Second: 1 |
Выход из bash функции
Если необходимо выйти из сценария, то для этого возможно использовать команду return
1 | return 0 |
Цифра возвращается в основной скрипт как статус выхода функции. При этом значение функции return является необязательным, и в этом случае статус выхода функции будет статусом последней команды, выполненной внутри функции. Когда return встречается внутри функции bash, функция немедленно завершается, и управление возвращается основному сценарию.
1 2 3 4 5 6 | function test { return 1 } test echo "[status]: $?" |
в результате скрипт вернет
1 | [status]: 1 |
Функцию return можно использовать для выхода из цикла, она остановит выполнения сценария функции и вернет управления основному сценарию.
Возврат значения из функции Bash
В некоторых случаях может потребоваться, чтобы функция bash возвращала значение в качестве вывода. Возвращаемое значение может быть строкой или числовым значением. Однако, в отличие от функций, поддерживаемых другими языками программирования, функции bash не могут напрямую возвращать значение в качестве вывода.
Использование глобальной переменной
В скрипте bash любая объявленная переменная рассматривается как глобальная (если явно не указана как локальная) и видна для всего bash сценария. Если изменить глобальную переменную внутри функции, это изменение будет видно и за пределами функции. Таким образом, чтобы вернуть значение основному сценарию, функция bash может просто сохранить возвращаемое значение в глобальной переменной.
1 2 3 4 5 6 7 | function test { val="Linux" } val="Windows" # global test echo "Output: $val" |
В результате работы сценарий вернет
1 | Output: Linux |
Использование команды echo
Другой способ вернуть значение функцией bash - использовать команду echo, которая выводит значение переменной и может быть передано в с помощью подстановки команд.
1 2 3 4 5 6 7 | function test { local val="Linux" echo val } output=$(test) echo "Output: $output" |
В результате сценарий выедет
1 | Output: Linux |