Introduktion till Bash-skriptning
Alex Scriven
Data Scientist
Att skicka argument till funktioner fungerar på samma sätt som till ett skript – med $1-notationen.
Du har också tillgång till de speciella ARGV-egenskaperna vi gick igenom tidigare:
$1, $2-notationen.$@ och $* ger alla argument i ARGV$# ger antalet argumentVi skickar in några filnamn som argument till en funktion för att demonstrera. Vi loopar igenom dem och skriver ut dem.
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
"Scope" i programmering syftar på hur tillgänglig en variabel är.
Varför spelar det roll? Om du försöker använda något med enbart lokalt scope kan programmet misslyckas med ett fel!
Till skillnad från de flesta programmeringsspråk (t.ex. Python och R) är alla variabler i Bash globala som standard.
function print_filename { first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt
Vara försiktig – globalt scope kan vara riskabelt eftersom oavsiktliga saker lättare kan hända.
Du kan använda nyckelordet local för att begränsa variabelns scope.
function print_filename { local first_filename=$1 }print_filename "LOTR.txt" "model.txt" echo $first_filename
F: Varför uppstod inget fel – bara en tom rad?
Svar: first_filename tilldelades det globala första ARGV-elementet ($1).
Skriptet kördes utan argument (bash script.sh), så det tilldelas ett tomt element. Var uppmärksam på detta!
Vi vet hur vi skickar in argument – men hur skickar vi ut dem?
Alternativet return i Bash är enbart avsett för att indikera om funktionen lyckades (0) eller misslyckades (andra värden 1–255). Det lagras i den globala variabeln $?
Våra alternativ är:
echo-a det vi vill returnera (sista raden i funktionen) och fånga det med skal-i-skalVi ser ett returfel:
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
Vad hände?
$? var 127 (fel)Vi returnerar korrekt ett värde för användning på annan plats i skriptet med echo och skal-i-skal:
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
Introduktion till Bash-skriptning