Android

Bash funkce

Bash a strukturované programování (Lukáš Bařinka)

Bash a strukturované programování (Lukáš Bařinka)

Obsah:

Anonim

Funkce Bash je v podstatě soubor příkazů, které lze opakovaně nazvat. Účelem funkce je pomoci vám učinit vaše bash skripty srozumitelnější a vyhnout se opakovanému psaní stejného kódu.

Ve srovnání s většinou programovacích jazyků jsou funkce Bash poněkud omezené. V tomto tutoriálu se seznámíme se základy funkcí Bash a ukážeme vám, jak je používat ve skriptech shellu.

Deklarace funkce Bash

Syntaxe pro deklarování bash funkce je velmi jednoduchá. Mohou být deklarovány ve dvou různých formátech:

  1. První formát začíná názvem funkce, za nímž následují závorky. Toto je preferovaný a více používaný formát.

    function_name () { commands }

    Jednořádková verze:

    function_name () { commands; }

    Druhý formát začíná slovem vyhrazeným pro function následovaným názvem funkce.

    function function_name { commands }

    Jednořádková verze:

    function function_name { commands; }

Je třeba poznamenat několik bodů:

  • Seznam příkazů mezi složenými závorkami {} je tělem funkce. Kudrnaté složené závorky, které obklopují tělo funkce, musí být od těla odděleny mezerami nebo novými řádky. Definování funkce ji neprovede. Chcete-li vyvolat funkci bash, jednoduše použijte název funkce. Příkazy mezi složenými složenými závorkami jsou prováděny vždy, když je funkce vyvolána ve skriptu shellu. Definice funkce musí být umístěna před jakýmkoli voláním funkce. Při použití „kompaktních“ funkcí jedné řádky středník ; musí následovat poslední příkaz ve funkci. Vždy byste se měli snažit udržovat popisy názvů funkcí.

Chcete-li to lépe pochopit, podívejte se na následující příklad:

~ / hello_world.sh

#!/bin/bash hello_world () { echo 'hello, world' } hello_world

Pojďme analyzovat kód po řádku:

  • V řádku 3 definujeme funkci tak, že jí dáme jméno, a otevřeme složenou závorku { která označuje začátek těla funkce. Linka 4 je funkční tělo. Tělo funkce může obsahovat více příkazů a deklarací proměnných. hello_world 5 , závorka se hello_world závorkami } , definuje konec funkce hello_world řádku 7 provádíme funkci. Tuto funkci můžete provádět tolikrát, kolikrát potřebujete.

Pokud spustíte skript, vytiskne ho hello, world .

Rozsah proměnných

Globální proměnné jsou proměnné, ke kterým lze přistupovat odkudkoli ve skriptu bez ohledu na rozsah. V Bash jsou všechny proměnné ve výchozím nastavení definovány jako globální, i když jsou deklarovány uvnitř funkce.

Lokální proměnné mohou být deklarovány v těle funkce pomocí local klíčového slova a mohou být použity pouze uvnitř této funkce. V různých funkcích můžete mít lokální proměnné se stejným názvem.

Abychom lépe ilustrovali, jak rozsah proměnných pracuje v Bash, podívejme se na příklad:

~ / variable_scope.sh

#!/bin/bash var1='A' var2='B' my_function () { local var1='C' var2='D' echo "Inside function: var1: $var1, var2: $var2" } echo "Before executing function: var1: $var1, var2: $var2" my_function echo "After executing function: var1: $var1, var2: $var2"

Skript začíná definováním dvou globálních proměnných var1 a var2 . Pak funkce, která nastaví lokální proměnnou var1 a modifikuje globální proměnnou var2 .

Before executing function: var1: A, var2: B Inside function: var1: C, var2: D After executing function: var1: A, var2: D

Z výše uvedeného výstupu můžeme usoudit, že:

  • Pokud nastavíte lokální proměnnou uvnitř těla funkce se stejným názvem jako existující globální proměnná, bude mít přednost před globální proměnnou. Globální proměnné lze v rámci funkce změnit.

Návratové hodnoty

Na rozdíl od funkcí v „reálných“ programovacích jazycích vám funkce Bash neumožňuje vrátit při volání hodnotu. Po dokončení funkce bash je její vrácená hodnota stav posledního příkazu provedeného ve funkci, 0 pro úspěch a nenulové desetinné číslo v rozsahu 1 - 255 pro selhání.

Návratový stav lze určit pomocí return klíčového slova a je přiřazen k proměnné $? . Příkaz return ukončí funkci. Můžete to považovat za stav ukončení funkce.

~ / return_values.sh

#!/bin/bash my_function () { echo "some result" return 55 } my_function echo $?

some result 55

Abychom skutečně vrátili libovolnou hodnotu z funkce, musíme použít jiné metody. Nejjednodušší možností je přiřadit výsledek funkce globální proměnné:

~ / return_values.sh

#!/bin/bash my_function () { func_result="some result" } my_function echo $func_result

some result

Další lepší možností vrácení hodnoty z funkce je odeslání hodnoty do stdout pomocí echo nebo printf jak je ukázáno níže:

~ / return_values.sh

#!/bin/bash my_function () { local func_result="some result" echo "$func_result" } func_result="$(my_function)" echo $func_result

some result

Namísto pouhého vykonání funkce, která vytiskne zprávu do stdout, přiřazujeme výstup funkce proměnné func_result pomocí substituce příkazu $() . Proměnnou lze později použít podle potřeby.

Předávání argumentů funkcím Bash

Chcete-li předat libovolný počet argumentů funkci bash, jednoduše je vložte hned za název funkce a oddělte je mezerou. Je dobrým zvykem argumenty dvojitě citovat, aby se zabránilo nesprávnému argumentaci s mezerami v něm.

  • Předané parametry jsou $1 , $2 , $3 $n , což odpovídá poloze parametru za názvem funkce. Proměnná $0 je vyhrazena pro název funkce. Proměnná $# obsahuje počet pozičních parametrů / argumentů předaných do function.The proměnné $* a $@ uchovávají všechny poziční parametry / argumenty předávané funkci.
    • Při dvojitém uvození se "$*" rozbalí na jediný řetězec oddělený mezerou (první znak IFS) - "$1 $2 $n" . Když se dvojité uvozovky, "$@" rozbalí na samostatné řetězce - "$1" "$2" "$n" . Pokud není dvojnásobně citován, $* a $@ jsou stejné.

Zde je příklad:

~ / absolvování_arguments.sh

#!/bin/bash greeting () { echo "Hello $1" } greeting "Joe"

Hello Joe

Závěr

Funkce Bash je blok opakovaně použitelného kódu navrženého k provedení určité operace. Jakmile je funkce definována, lze ji ve skriptu volat vícekrát.

Můžete si také přečíst informace o tom, jak pomocí funkce Bash vytvořit nezapomenutelný zkratkový příkaz pro delší příkaz.

bash terminál