GNU/Linux >> Znalost Linux >  >> Linux

Funkce Bash a jak ji používat {Proměnné, argumenty, návrat}

Úvod

Funkce bash je metoda používaná ve skriptech shellu k seskupování opakovaně použitelných bloků kódu. Tato funkce je dostupná pro většinu programovacích jazyků, známých pod různými názvy, jako jsou procedury, metody nebo podprogramy.

Tento článek poskytuje úplný přehled funkcí bash, jak fungují a jak je používat.

Předpoklady

  • Systém se systémem Linux.
  • Přístup k terminálu a prostředí Bash.
  • Textový editor pro psaní bash skriptů (průvodce používá Vim).

Co jsou funkce Bash?

Funkce bash je technika pro seskupování opakovaně použitelných bitů kódu pod jedním názvem pro pozdější použití. Funkce bash je jako skript ve skriptu.

Používání funkcí ve skriptování bash přináší dvě výhody :

1. Funkce je načtena přímo do paměti shellu a uložena pro pozdější použití. Vzhledem k tomu, že paměť počítače není v dnešní době problém, je používání funkcí rychlejší než opakování kódu.

2. Funkce pomáhají organizovat dlouhé skripty shellu do modulárních a opakovaně použitelných bloků kódu. Kusy se snáze vyvíjejí a udržují .

Jak používat funkce Bash?

Existují dva způsoby, jak implementovat funkce Bash:

  • Uvnitř skriptu shellu, kde musí být definice funkce před každým voláním funkce.
  • Spolu s dalšími příkazy alias bash a přímo v terminálu jako příkaz.

Chcete-li použít funkce bash, postupujte podle následujících pokynů.

Syntaxe funkce Bash

Existují dva různé způsoby, jak deklarovat bash funkci:

1. Nejpoužívanější formát je:

<function name> () { 
        <commands> 
}

Alternativně může být stejnou funkcí jeden řádek:

<function name> () { <commands>; }

2. Alternativním způsobem zápisu funkce bash je použití vyhrazeného slova function :

function <function name> {
        <commands>
}

Nebo na jednom řádku:

function <function name> { <commands>; }

Při používání funkcí vezměte na vědomí následující chování a tipy:

  • Při psaní na jeden řádek musí příkazy končit středníkem (; ), ať už v bash skriptech nebo přímo v terminálu.
  • Přidání function vyhrazené slovo činí závorky volitelnými.
  • Příkazy mezi složenými závorkami { <commands> } se nazývají tělo funkce . Tělo může obsahovat libovolný počet deklarací, proměnných, cyklů nebo podmíněných příkazů.
  • Zkuste pro funkce použít popisné názvy. Ačkoli to není nutné při testování funkcí a příkazů, popisné názvy pomáhají v nastavení, kde se na kód dívají ostatní vývojáři.

Jak deklarovat a volat funkci?

Funkce se při deklaraci nespustí. Tělo funkce se spustí při vyvolání po deklaraci. Chcete-li vytvořit bash skript s různými možnostmi syntaxe, postupujte podle následujících kroků:

1. Pomocí svého oblíbeného textového editoru vytvořte skript shellu s názvemsyntaxe . Pokud používáte Vim, spusťte v terminálu následující řádek:

vim syntax.sh

2. Přidejte níže uvedený kód do skriptu shellu:

# syntax.sh
# Declaring functions using the reserved word function
# Multiline
function f1 {
        echo Hello I\'m function 1
        echo Bye!
}
# One line
function f2 { echo Hello I\'m function 2; echo Bye!; }

# Declaring functions without the function reserved word
# Multiline
f3 () { 
        echo Hello I\'m function 3
        echo Bye!
}
# One line
f4 () { echo Hello I\'m function 4; echo Bye!; }

# Invoking functions
f4
f3
f2
f1

Skript provede následující:

  • Řádky 4–9 demonstrovat, jak definovat funkci pomocí function vyhrazené slovo. Funkce f1 používá víceřádkovou syntaxi v řádcích 4-6, zatímco f2 používá jednořádkovou syntaxi na řádku 9.
  • Řádky 13–18 zobrazit známější syntaxi. f3 je víceřádková funkce definovaná v řádcích 13-16, zatímco f4 na řádku 18 je ekvivalent jednoho řádku.
  • Řádky 21–24 vyvolat dříve definované funkce a provést příkazy v tělech odpovídajících funkcí. Volání se provádějí v obráceném pořadí oproti definici.

3. Uložte skript a zavřete Vim:

:wq

4. Vytvořte syntax.sh spustitelný soubor:

chmod +x syntax.sh

5. Nakonec spusťte skript, abyste viděli výstup:

./syntax.sh

Jak deklarovat a volat funkci v terminálu?

Chcete-li deklarovat a používat funkci v terminálu:

1. Otevřete terminál a zadejte následující řádek:

my_function () { echo "Hello I'm a function"; echo "Bye!"; }

2. Spusťte funkci zadáním názvu funkce do terminálu:

my_function

Výstup spustí příkazy v těle funkce.

Funkce zůstane definovaná pouze v aktuální relaci terminálu. Chcete-li uložit pro budoucí relace, přidejte kód do ~/.bashrc soubor.

Kde je definována funkce Bash?

Chcete-li zjistit, kde je funkce bash definována a její obsah, zadejte do terminálu následující příkazy:

1. Spusťte bash shell v režimu debuggeru:

bash --debugger

2. Zkontrolujte zdrojový soubor funkce pomocí:

declare -F <function name>

Například:

declare -F my_function

Výstup vytiskne název funkce, číslo řádku a umístění souboru, kde je definice funkce.

3. Chcete-li zobrazit obsah funkce, spusťte:

declare -f <function name>

Například:

declare -f my_function

declare vestavěný režim ladění umožňuje prohlížení obsahu a umístění funkce bez spouštění kódu.

Jak odstranit funkci Bash?

Pokud potřebujete uvolnit jmenný prostor obsazený funkcí v aktuální relaci terminálu, spusťte:

unset <function name>

Například:

unset my_function

Funkce již není v aktuální relaci terminálu dostupná. Pokud je však kód v ~/.bashrc soubor, vše se v další relaci vrátí do normálu.

Proměnné funkce Bash

Proměnné v bash jsou ve výchozím nastavení globální a přístupné odkudkoli, včetně těl funkcí. Proměnné definované uvnitř funkce jsou také globální. Přidání klíčového slova local zpřístupňuje termín pouze v rámci funkce a podřízených funkcí/procesů.

V dynamickém rozsahu , lokální proměnná stíny globální proměnná, když obě nesou stejný název.

Vyzkoušejte následující bash skript, abyste demonstrovali, jak funkční proměnné fungují v bash:

1. Vytvořte skript s názvem variable.sh :

vim variable.sh

2. Přidejte do skriptu následující kód:

var1=1
var2=1
change() {
        echo Inside function
        echo Variable 1 is: $var1
        echo Variable 2 is: $var2
        local var1=5
        var2=5
        echo
        echo After change inside function
        echo Variable 1 is locally $var1
        echo Variable 2 is globally $var2
}
echo Before function invocation
echo Variable 1 is: $var1
echo Variable 2 is: $var2
echo
change
echo
echo After function invocation
echo Variable 1 is: $var1
echo Variable 2 is: $var2

Skript zobrazuje následující:

  • Řádky 1–2 deklarovat proměnné var1 a var2 a oba je nastavte na 1 .
  • Řádky 5–6 jsou uvnitř těla funkce a vypisují proměnné do konzole. Protože rozsah proměnné je globální, vytisknou se původní hodnoty.
  • Řádek 7 deklaruje novou lokální proměnnou se stejným názvem jako globální proměnná var1 . local var1 stíní globální var1 hodnotu díky dynamickému rozsahu.
  • Řádek 8 změní hodnotu globálního var2 proměnná.
  • Řádky 14–22 vytisknout hodnoty proměnných před a po volání funkce.

3. Uložte skript a ukončete Vim:

:wq

4. Změňte oprávnění k souboru na spustitelný soubor:

chmod +x variable.sh

5. Spusťte skript a analyzujte výsledky:

./variable.sh

Hodnoty proměnných se vytisknou do konzole prostřednictvím změn provedených ve skriptu.

Argumenty funkce Bash

Chcete-li předat argumenty funkci, přidejte parametry za volání funkce oddělené mezerami. Níže uvedená tabulka uvádí dostupné možnosti při práci s argumenty funkce bash.

Argument Role
$0 Rezervuje název funkce, když je definován v terminálu. Když je definováno ve skriptu bash, $0 vrátí název a umístění skriptu.
$1 , $2 atd. Odpovídá pozici argumentu za názvem funkce.
$# Uchovává počet pozičních argumentů předávaných funkci.
[email protected] a $* Podržte seznam pozičních argumentů a fungujte stejně, když se použije tímto způsobem.
"[email protected]" Rozšíří seznam na samostatné řetězce. Například "$1", "$2" atd.
"$*" Rozbalí seznam do jednoho řetězce a odděluje parametry mezerou. Například "$1 $2" atd.

Postupujte podle níže uvedených kroků a otestujte, jak různé argumenty fungují ve funkci.

1. Vytvořte skript s názvem argumenty :

vim arguments.sh

2. Přidejte do skriptu následující kód:

arguments () {
        echo The function location is $0
        echo There are $# arguments
        echo "Argument 1 is $1"
        echo "Argument 2 is $2"
        echo "<[email protected]>" and "<$*>" are the same.
        echo List the elements in a for loop to see the difference!
        echo "* gives:"
        for arg in "$*"; do echo "<$arg>"; done
        echo "@ gives:"
        for arg in "[email protected]"; do echo "<$arg>"; done
}

arguments hello world

3. Uložte skript a ukončete Vim:

:wq

4. Nastavte skript jako spustitelný:

chmod +x arguments.sh

5. Spusťte skript:

./arguments.sh

Výstup zobrazuje popisné zprávy pro každý použitý argument.

Návrat funkce Bash

Funkce Bash se liší od většiny programovacích jazyků, pokud jde o vrácení hodnoty z funkce. Ve výchozím nastavení bash vrací stav ukončení posledního provedeného příkazu v těle funkce.

Skript níže ukazuje, jak zadat stav ukončení pomocí return:

1. Vytvořte skript a pojmenujte jej test.sh :

vim test.sh

2. Přidejte do souboru následující funkci:

test_function() {
        echo Test
        return 100
}
echo The function\'s output is: 
test_function
echo The exit status is:
echo $?

3. Uložte a zavřete textový editor:

:wq

4. Změňte oprávnění:

chmod +x test.sh

5. Spusťte skript, abyste viděli výstup funkce a stav ukončení:

./test.sh

Alternativní metoda je zopakovat výsledek funkce a přiřadit výstup proměnné. Upravte soubor test.sh skript s následujícím kódem:

test_function() {
        echo Test
}
result=$(test_function)
echo $result is saved in a variable for later use

Tato metoda napodobuje, jak funguje většina programovacích jazyků při používání funkcí.


Linux
  1. Jak používat vstupy ve skriptech shellu

  2. jak použít kill SIGUSR2 v bash?

  3. Jak zruším nastavení nebo se zbavím funkce bash?

  1. Jak používat příkazy historie Bash

  2. Jak volat funkci Bash ve skriptu Bash uvnitř Awk?

  3. jak správně použít $1 v aliasu se dvěma argumenty

  1. Jak používat příkaz if else Conditionals ve skriptu Bash

  2. Jak vytvářet a volat funkce v Bash

  3. Jak mohu použít řádky souboru jako argumenty příkazu?