Jak przekazać parametry do działania w skrypcie bash?


14

Chciałbym napisać funkcję, którą mogę wywołać ze skryptu z wieloma różnymi zmiennymi. Z niektórych powodów mam z tym wiele problemów. Przykłady, które czytałem, zawsze używają po prostu zmiennej globalnej, ale to nie uczyniłoby mojego kodu o wiele bardziej czytelnym, o ile widzę.

Przykład zastosowania zgodnego z przeznaczeniem:

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
result=$para1 + $para2
}

add $var1 $var2
add $var3 $var4
# end of the script

./myscript.sh 1 2 3 4

Próbowałem użyć $1tej funkcji w funkcji, ale potem bierze ona tylko globalny, z którego został wywołany cały skrypt. Zasadniczo szukam czegoś takiego $1, $2ale w lokalnym kontekście funkcji. Jak wiesz, funkcje działają w dowolnym odpowiednim języku.


Używając 1 $ i 2 $ w twoim przykładzie dodaj funkcję „działa”. Spróbuj echo $1i echo $2w tym.
Wieland

Mój przykład był strasznie niepełny, zaktualizowałem go kilka. Teraz afaik, to już nie będzie działać.
user181822 27.07.16

Wymień result = się result=$(($1 + $2))i dodaj echo $resultpo nim i działa poprawnie, 1 $ i $ 2 to twoje argumenty funkcji.
Wieland

Odpowiedzi:


18

Aby wywołać funkcję z argumentami:

function_name "$arg1" "$arg2"

Funkcja odnosi się do przekazanych argumentów według ich pozycji (a nie nazwy), czyli 1 $, 2 $ i tak dalej. $ 0 to nazwa samego skryptu.

Przykład:

#!/bin/bash

add() {
    result=$(($1 + $2))
    echo "Result is: $result"
}

add 1 2

Wynik

./script.sh
 Result is: 3

2
Teraz zdaję sobie sprawę z mojego błędu. Użyłem 0 $ i 1 $ w funkcji, a 0 $ faktycznie rozwiązało nazwę skryptu. Pomyliłem to z parametrem skryptu, a nie z samą funkcją. Dziękuję Ci!
user181822,

6

W głównym skrypcie $ 1, $ 2 reprezentuje zmienne, jak już wiesz. W indeksach dolnych lub funkcjach $ 1 i $ 2 będą reprezentować parametry przekazywane do funkcji jako wewnętrzne (lokalne) zmienne dla tego indeksu dolnego.

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
  #Note the $1 and $2 variables here are not the same of the
  #main script... 
  echo "The first argument to this function is $1"
  echo "The second argument to this function is $2"
  result=$(($1+$2))
  echo $result

}

add $var1 $var2
add $var3 $var4
# end of the script


./myscript.sh 1 2 3 4
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.