Argument, returvärden och scope

Introduktion till Bash-skriptning

Alex Scriven

Data Scientist

Skicka argument till Bash-funktioner

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:

  • Varje argument nås via $1, $2-notationen.
  • $@ och $* ger alla argument i ARGV
  • $# ger antalet argument
Introduktion till Bash-skriptning

Exempel på argumentöverföring

Vi 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
Introduktion till Bash-skriptning

Scope i programmering

 

"Scope" i programmering syftar på hur tillgänglig en variabel är.

  • "Global" innebär att något är åtkomligt överallt i programmet – även inuti FOR-loopar, IF-satser, funktioner osv.
  • "Local" innebär att något bara är åtkomligt i en viss del av programmet.

Varför spelar det roll? Om du försöker använda något med enbart lokalt scope kan programmet misslyckas med ett fel!

Introduktion till Bash-skriptning

Scope i Bash-funktioner

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.

Introduktion till Bash-skriptning

Begränsa scope i Bash-funktioner

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!

Introduktion till Bash-skriptning

Returvärden

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:

  1. Tilldela till en global variabel
  2. echo-a det vi vill returnera (sista raden i funktionen) och fånga det med skal-i-skal
Introduktion till Bash-skriptning

Ett returfel

Vi 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?

  1. Det uppstod ett fel när vi anropade funktionen
    • Skriptet försökte hitta 'echlo' som ett program, men det fanns inte
  2. Returvärdet i $? var 127 (fel)
Introduktion till Bash-skriptning

Korrekt returhantering

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
  • Lägg märke till att vi inte längre behöver skapa den mellanliggande variabeln.
Introduktion till Bash-skriptning

Nu kör vi en övning!

Introduktion till Bash-skriptning

Preparing Video For Download...