Аргументы, возвращаемые значения и область видимости

Введение в Bash-скриптинг

Alex Scriven

Data Scientist

Передача аргументов в функции Bash

Передача аргументов в функции работает так же, как и в скрипты — с помощью нотации $1.

Также доступны специальные свойства ARGV, о которых мы уже говорили:

  • Каждый аргумент доступен через нотацию $1, $2.
  • $@ и $* возвращают все аргументы из ARGV
  • $# возвращает количество аргументов
Введение в Bash-скриптинг

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

Рассмотрим пример: передадим имена файлов в функцию, пройдёмся по ним в цикле и выведем каждое.

function print_filename {
    echo "The first file was $1"

for file in $@ do echo "This file has name $file" done }
print_filename "LOTR.txt" "mod.txt" "A.py"

 

 

 

The first file was LOTR.txt
This file has name LOTR.txt
This file has name mod.txt
This file has name A.py
Введение в Bash-скриптинг

Область видимости в программировании

 

«Область видимости» в программировании — это доступность переменной в различных частях кода.

  • «Глобальная» область означает, что переменная доступна везде: в циклах FOR, условиях IF, функциях и т. д.
  • «Локальная» область означает, что переменная доступна только в определённой части программы.

Почему это важно? Попытка обратиться к переменной с локальной областью видимости из другого места приведёт к ошибке!

Введение в Bash-скриптинг

Область видимости в функциях Bash

В отличие от большинства языков программирования (например, Python и R), все переменные в Bash по умолчанию являются глобальными.

function print_filename {
    first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt

Будьте осторожны: глобальная область видимости повышает риск непредвиденного поведения программы.

Введение в Bash-скриптинг

Ограничение области видимости в функциях Bash

Ключевое слово local позволяет ограничить область видимости переменной.

function print_filename {
    local first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename


 

Вопрос: почему вместо ошибки вывелась пустая строка?

Ответ: first_filename получила значение глобального первого элемента ARGV ($1).

Скрипт был запущен без аргументов (bash script.sh), поэтому значение по умолчанию — пустая строка. Будьте внимательны!

Введение в Bash-скриптинг

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

Мы научились передавать аргументы в функции — теперь разберёмся, как возвращать значения из них.

Оператор return в Bash предназначен только для обозначения успеха (0) или ошибки (значения 1–255). Результат сохраняется в глобальной переменной $?.

Доступные варианты:

  1. Присвоить результат глобальной переменной
  2. Вывести нужное значение через echo (последняя строка функции) и захватить его через подоболочку
Введение в Bash-скриптинг

Пример ошибки возврата

Посмотрим на пример ошибки возврата:

function function_2 {
    echlo # An error of 'echo'
}

function_2 # Call the function echo $? # Print the return value
script.sh: line 2: echlo: command not found
127

Что произошло?

  1. При вызове функции возникла ошибка
    • Скрипт попытался найти программу «echlo», но она не существует
  2. Возвращаемое значение в $? оказалось равно 127 (ошибка)
Введение в Bash-скриптинг

Корректный возврат значений

Покажем, как правильно вернуть значение для использования в скрипте — с помощью echo и захвата через подоболочку:

function convert_temp {
    echo $(echo "scale=2; ($1 - 32) * 5 / 9" | bc)
}

converted=$(convert_temp 30) echo "30F in Celsius is $converted C"
30F in Celsius is -1.11 C
  • Обратите внимание: промежуточная переменная больше не нужна!
Введение в Bash-скриптинг

Давайте потренируемся!

Введение в Bash-скриптинг

Preparing Video For Download...