Wprowadzenie do skryptów Bash
Alex Scriven
Data Scientist
Przekazywanie argumentów do funkcji jest podobne do przekazywania ich do skryptu – używamy notacji $1.
Dostępne są również omówione wcześniej właściwości ARGV:
$1, $2 itd.$@ i $* zwracają wszystkie argumenty z ARGV$# zwraca liczbę argumentówPrzekażemy nazwy plików jako argumenty do funkcji, która przejdzie przez nie w pętli i wyświetli ich nazwy.
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
„Zasięg" w programowaniu określa dostępność zmiennej.
Dlaczego to ważne? Próba odwołania się do zmiennej o zasięgu lokalnym może spowodować błąd!
W odróżnieniu od większości języków programowania (np. Pythona i R), wszystkie zmienne w Bash są domyślnie globalne.
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
Globalny zasięg może być niebezpieczny – zwiększa ryzyko niezamierzonych efektów ubocznych.
Słowo kluczowe local pozwala ograniczyć zasięg zmiennej.
function print_filename { local first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
P: Dlaczego nie pojawił się błąd, tylko pusty wiersz?
Odpowiedź: first_filename zostało przypisane do globalnego pierwszego elementu ARGV ($1).
Skrypt uruchomiono bez argumentów (bash script.sh), więc zmienna domyślnie jest pusta. Należy zachować ostrożność!
Wiemy, jak przekazywać argumenty – jak je zwracać?
Opcja return w Bash służy wyłącznie do wskazania, czy funkcja zakończyła się sukcesem (0) czy niepowodzeniem (wartości 1–255). Wynik jest zapisywany w zmiennej globalnej $?
Możliwe rozwiązania:
echo na wyniku (ostatnia linia funkcji) i przechwycenie przez powłokę zagnieżdżonąPrzykład błędu zwracanego:
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
Co się stało?
$? wyniosła 127 (błąd)Aby poprawnie zwrócić wartość do dalszego użycia w skrypcie, używamy echo i powłoki zagnieżdżonej:
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
Wprowadzenie do skryptów Bash