Вступ до Bash Scripting
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 Scripting