Введение в Bash-скриптинг
Alex Scriven
Data Scientist
Передача аргументов в функции работает так же, как и в скрипты — с помощью нотации $1.
Также доступны специальные свойства ARGV, о которых мы уже говорили:
$1, $2.$@ и $* возвращают все аргументы из ARGV$# возвращает количество аргументовРассмотрим пример: передадим имена файлов в функцию, пройдёмся по ним в цикле и выведем каждое.
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
«Область видимости» в программировании — это доступность переменной в различных частях кода.
Почему это важно? Попытка обратиться к переменной с локальной областью видимости из другого места приведёт к ошибке!
В отличие от большинства языков программирования (например, Python и R), все переменные в Bash по умолчанию являются глобальными.
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
Будьте осторожны: глобальная область видимости повышает риск непредвиденного поведения программы.
Ключевое слово local позволяет ограничить область видимости переменной.
function print_filename { local first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
Вопрос: почему вместо ошибки вывелась пустая строка?
Ответ: first_filename получила значение глобального первого элемента ARGV ($1).
Скрипт был запущен без аргументов (bash script.sh), поэтому значение по умолчанию — пустая строка. Будьте внимательны!
Мы научились передавать аргументы в функции — теперь разберёмся, как возвращать значения из них.
Оператор return в Bash предназначен только для обозначения успеха (0) или ошибки (значения 1–255). Результат сохраняется в глобальной переменной $?.
Доступные варианты:
echo (последняя строка функции) и захватить его через подоболочкуПосмотрим на пример ошибки возврата:
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
Что произошло?
$? оказалось равно 127 (ошибка)Покажем, как правильно вернуть значение для использования в скрипте — с помощью 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-скриптинг