Introduzione al Bash Scripting
Alex Scriven
Data Scientist
Passare argomenti alle funzioni è come passarli a uno script, con la notazione $1.
Hai anche accesso alle proprietà speciali di ARGV viste prima:
$1, $2, ecc.$@ e $* danno tutti gli argomenti in ARGV$# dà il numero di argomentiPassiamo alcuni nomi di file come argomenti a una funzione per fare una demo. Li iteriamo e li stampiamo.
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
Lo 'scope' in programmazione indica quanto è accessibile una variabile.
Perché conta? Se accedi a qualcosa con scope locale fuori dal suo ambito, il programma può dare errore!
Diversamente dalla maggior parte dei linguaggi (es. Python e R), in Bash tutte le variabili sono globali di default.
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
Attenzione: lo scope globale è rischioso, è più facile causare effetti indesiderati.
Puoi usare la keyword local per limitare lo scope delle variabili.
function print_filename { local first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
D: Perché non c'è stato un errore, ma solo una riga vuota?
R: first_filename è stato assegnato al primo elemento globale di ARGV ($1).
Ho eseguito lo script senza argomenti (bash script.sh), quindi è vuoto per default. Occhio!
Sappiamo come passare argomenti in input: come riportarli in output?
L'opzione return in Bash serve solo a indicare successo (0) o errore (altri valori 1-255). È salvata nella variabile globale $?
Le opzioni sono:
echo del valore (ultima riga della funzione) e catturarlo con subshellVediamo un errore di return:
function function_2 { echlo # Errore di 'echo' }function_2 # Chiama la funzione echo $? # Stampa il valore di ritorno
script.sh: line 2: echlo: command not found
127
Che è successo?
$? è 127 (errore)Restituiamo correttamente un valore da usare altrove nello script con echo e cattura in subshell:
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
Introduzione al Bash Scripting