Путь разработчика    

Функции в Bash


Содержание

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

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

Функции

Создание функции довольно просто. Они могут быть написаны в двух разных форматах:

Shell

или

Shell

Несколько замечаний:

  • Любой из указанных выше способов задания функции действителен. Оба действуют одинаково, и нет никаких преимуществ или недостатков для одного над другим. Это действительно личное предпочтение.
  • В других языках программирования обычно передаются аргументы функции, перечисленной внутри скобок (). В Баше они есть только для украшения, и вы никогда ничего не вкладываете в них.
  • Определение функции (сама фактическая функция) должно появляться в скрипте перед любыми вызовами функции.

Давайте рассмотрим простой пример:

function_example.sh

Shell

Давайте разберем это:

  • Строка 4 - Мы начинаем определять функцию, указывая ей имя.
  • Строка 5 - В фигурных скобках у нас может быть столько команд, сколько нам нравится.
  • Строки 8 и 9. После того, как функция определена, мы можем назвать ее столько раз, сколько нам нравится, и она выполнит эти команды.

Передача аргументов

Часто бывает так, что мы хотели бы, чтобы функция обрабатывала некоторые данные для нас. Мы можем отправлять данные в функцию аналогично передаче аргументов командной строки скрипту. Мы приводим аргументы непосредственно после имени функции. В рамках функции они доступны как $1, $2 и т. д.

arguments_example.sh

Shell

Возвращаемые значения

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

return_status_example.sh

Shell

Давайте разберем его

  • Строка 6 - Статус возврата не обязательно должен быть жестко запрограммирован. Это может быть переменная
  • Строка 11 - Помните, что переменная $? содержит статус возврата ранее выполняемой команды или функции.

Обычно статус возврата 0 указывает, что все прошло успешно. Значение, отличное от нуля, указывает на возникшую ошибку.

Если все, что вы хотите сделать, это вернуть число (например, результат вычисления), то вы можете рассмотреть возможность использования возвращаемого статуса для достижения этого. Это не намеренная цель, но она будет работать.

Один из способов обойти это - использовать Command Substitution и заставить функцию распечатать результат (и только результат).

return_hack.sh

Shell

Давайте разберем это:

  • Строка 5 - эта команда будет печатать количество строк в файле, на которое ссылается $ 1.
  • Строка 8 - Мы используем подстановку команд, чтобы взять то, что обычно печатается на экране, и назначать ее переменной num_lines

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

Область переменных

Область действия относится к тому, какие части скрипта могут видеть, какие переменные. По умолчанию переменная является глобальной . Это означает, что это видно повсюду в скрипте. Мы также можем создать переменную как локальную переменную. Когда мы создаем локальную переменную внутри функции, она видна только внутри этой функции. Для этого мы используем ключевое слово local перед переменной в первый раз, когда мы устанавливаем его значение.

Shell

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

local_variables.sh

Shell

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

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

Переопределение команд

Можно назвать функцию как то же имя, что и команда, которую вы обычно используете в командной строке. Это позволяет создать обертку. например. Может быть, каждый раз, когда мы вызываем команду ls в нашем скрипте, мы действительно хотим, чтобы ls -lh . Мы могли бы сделать следующее:

override.sh

Shell

Давайте разберем это:

  • Строка 5 - Когда мы имеем функцию с тем же именем, что и команда , нам нужно поместить ключевое слово команды перед именем , когда мы хотим , чтобы команда , в отличие от функции , как функция обычно имеет приоритет.

В приведенном выше примере, если бы мы не поставили ключевую команду перед ls в строке 5, мы закончили бы бесконечный цикл. Несмотря на то, что мы находимся внутри функции ls, когда мы вызываем ls, она вызвала бы другой экземпляр функции ls, который, в свою очередь, сделал бы то же самое и так далее.

Легко забыть ключевое слово команды и заканчиваться бесконечным циклом. Если вы столкнулись с этим, вы можете отменить запуск сценария, одновременно нажав клавиши CTRL c на клавиатуре. CTRL c - отличный способ отменить ваш скрипт (или программу) всякий раз, когда вы попадаете в проблему в командной строке.

Дизайн

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

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

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

Иногда полезно размещать вспомогательные задачи внутри функций, чтобы они были логически отделены от основной части скрипта. Общим примером является проверка ввода (например, обеспечение того, что указанный файл существует и доступен для чтения).

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

Однако вам нужно найти правильный баланс. Если функции слишком велики и требуют слишком большой обработки, то вы не получите полной выгоды. Если вы разделите слишком много функций, ваш код может легко расти и стать глупым. С опытом вы найдете это сладкое пятно посередине.

Часть 6. Циклы for, while, until в Bash

Источник: https://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php



Отзывы (через аккаунты в социальных сетях Вконтакте или Facebook):

Оставить отзыв с помощью аккаунта ВКонтакте:

Оставить отзыв с помощью аккаунта FaceBook:

Как разделить и объединить строки в C#

В этом примере показано, как использовать методы string для разделения и объединения строк. Метод string класса Split разбивает строку на части, разделенны...

14 07 2019 7:17:56

HashMap в Java

В терминах компьютерного программирования карта представляет собой набор ассоциаций между парами объектов. Java HashMap - это базовая реализация интерфейса...

13 07 2019 15:37:39

Почему класс Java не может быть объявлен как статический?

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

12 07 2019 5:11:44

Как нарисовать анимированный текст в C#

Обратите внимание, что результат в исполняемом файле лучше, чем результат, предоставляемый GIF справа. GIF немного отрывистый, потому что он использует тол...

11 07 2019 1:11:33

Разница между capacity() и size() вектора в Java

Разница между capacity() и size() в Java.util.Vector заключается в том, что size() - это количество элементов, которые в настоящее время удерживаются, а ca...

10 07 2019 5:10:10

Список доступных кодов культуры в C#

В этом примере показано, как вы можете составить список кодов культуры, доступных в системе. Несколько примеров C# Helper относятся к глобализации, включая...

09 07 2019 6:30:11

Используйте WMI для получения количества физических и логических процессоров в C#

В этом примере показано, как вы можете определить количество процессоров вашего компьютера, как физических, так и логических. Многие компьютеры в наши дни...

08 07 2019 13:23:17

1С:Предприятие. Конфигурирование и администрирование для начинающих (Владимир Дубянский)

В книге 1 С: Предприятие. Конфигурирование и администрирование для начинающих описаны основные приемы программирования и конфигурирования, общие для всех ком...

07 07 2019 20:38:50

Показывать сложный интерес в C#

Это более графическая версия примера Рассчитайте значение ежемесячной инвестиции в C# . Вместо добавления значений в элемент управления ListView этот приме...

06 07 2019 0:41:51

Распечатайте форму или элемент управления в C#

В этом примере показано, как вы можете распечатать форму или элемент управления в программе на C#. Еще во времена Visual Basic 6 был метод PrintForm. Он пр...

05 07 2019 15:21:31

PHP 5 для начинающих (Дэйв У. Мерсер, Аллан Кент, Стивен Д. Новицки)

Эта книга представляет собой подробное учебное пособие для желающих освоить современную версию PHP. В книге описывается установка и конфигурирование PHP, о...

04 07 2019 14:23:42

Анимация изображений в C#

В этом примере показано, как анимировать изображения, загружая их во время выполнения, а затем воспроизводя их по одному. Чтобы упростить поиск изображений...

03 07 2019 1:10:12

Программирование на Java и С# для студента (О. В. Герман, Ю. О Герман)

Рассмотрены основные вопросы программирования на языках JAVA и С#, включая их сравнительное описание как двух важнейших и весьма сходных прикладных платфор...

02 07 2019 18:59:55

Нарисуйте цветное колесо с альфа-и насыщенными значениями в C#

Пример Нарисуйте цветное колесо цвета в C# показывает, как рисовать цветовое колесо. В этом примере вы можете использовать полосы прокрутки для изменения з...

01 07 2019 18:31:42

Разница между абстрактным классом и интерфейсом в Java

Термин « Абстракция» означает скрытие внутренней реализации функции и только отображение функциональности для пользователей. Это означает, что абстрактный к...

30 06 2019 3:23:42

Проверка, нет ли строки в C#

В этом примере используются три строки для сравнения разных методов для определения, является ли строка пустой. Один из методов: метод string класса IsNull...

29 06 2019 2:10:48

Delphi 6. Учебный курс (В. В. Фаронов)

В книге "Delphi 6. Учебный курс" даются начальные сведения по системе программирования Delphi, разработанной американской корпорацией Borland International...

28 06 2019 12:40:37

Как связаны методы наследования и переопределения?

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

27 06 2019 0:14:27

Основы программирования в Delphi 7 (Н. Б.Культин)

Книга является руководством по программированию в среде Delphi 7. Описывается весь процесс разработки программы: от конструирования диалогового окна до орг...

26 06 2019 14:54:18

Список символов, недопустимых в именах файлов и путей в C#

В этом примере используется следующий код для отображения символов, недопустимых в именах файлов и путей. Источник: http://csharphelper.com/blog/2015/08/li...

25 06 2019 6:53:46

Список языков, которые вы можете компилировать во время выполнения в C#

Пример Запуск введенного пользователем кода в C# показывает как позволить пользователю вводить код C#, компилировать во время выполнения и выполнять резуль...

24 06 2019 4:24:12

Уникальные слова в файле Microsoft Word в C#

Этот пример является модификацией более раннего сообщения Перечислить уникальные слова в файле Microsoft Word на C# . Эта программа считывает слова в текст...

23 06 2019 22:16:54

Статическая синхронизация с нестатической синхронизацией в Java

Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока будут обращаться к тем же полям или объектам одновр...

22 06 2019 0:28:57

Позвольте пользователю выбрать принтер, а затем отправить распечатку непосредственно на него в C#

... Когда пользователь выбирает принтер и нажимает кнопку « Печать», следующий код отправляет распечатку на выбранный принтер. Источник: http://csharphelper...

21 06 2019 10:14:17

Как сделать слегка окрашенную кнопку в C#

Сделать отображение кнопки изображение под ним в C# показывает, как заставить кнопку отображать снимок, который лежит под ним. К сожалению, кнопка только д...

20 06 2019 14:44:43