Funkce prostředí Bash jsou způsob, jak seskupit několik příkazů UNIX / Linux pro pozdější spuštění pomocí jediného názvu skupiny . Funkce Bash shell může být spuštěna stejně jako běžný příkaz Unix. Funkce shellu se spouštějí v aktuálním kontextu shellu, aniž by se vytvářel nový proces k jejich interpretaci.
Jak aliasy bash, tak funkce umožňují definovat zkratky pro delší nebo složitější příkazy. Aliasy však neumožňují ovládací toky, argumenty a další triky, které tyto funkce umožní, jak je vysvětleno v tomto tutoriálu.
Tento článek je součástí probíhající série výukových programů bash. Podívejte se na náš dřívější výukový program o úvodu bash, stavu existence bash a příkladech aliasů bash.
Syntaxe pro vytvoření bash funkce:
function functionname() { commands . . }
- funkce je klíčové slovo, které je volitelné.
- název funkce je název funkce
- příkazy – Seznam příkazů, které mají být provedeny ve funkcích.
Funkce přijímá argumenty. Během provádění se z argumentů funkce stanou poziční parametry. Poziční parametr 0 bude mít název skriptu, který zůstane nezměněn.
Funkci bash můžete volat z příkazového řádku, jak je znázorněno níže:
$ functionname arg1 arg2
- Když shell interpretuje příkaz Linuxu, nejprve se podívá na speciální vestavěné funkce, jako je break, continue, eval, exec atd., a poté hledá funkce shellu.
- Stav ukončení funkce bash je stav ukončení posledního příkazu provedeného v těle funkce.
Poznámka: Umístěte definice funkcí shellu do spouštěcího souboru shellu (například .bash_profile ). Tímto způsobem je funkce shellu vždy dostupná z příkazového řádku. Informace o tom, kdy bude .bash_profile spuštěn, naleznete v našem dřívějším článku o sekvenci provádění bash.
Příklad 1:Funkce pro zobrazení dlouhého seznamu souborů s danou příponou
Funkce „lsext“ slouží k vyhledání seznamu souborů v aktuálním adresáři, který má danou příponu, jak je uvedeno níže. Tato funkce používá kombinaci příkazu find a příkazu ls k dokončení úlohy.
$ function lsext() { find . -type f -iname '*.'${1}'' -exec ls -l {} \; ; } $ cd ~ $ lsext txt -rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt -rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt -rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt -rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt
Příklad 2. Funkce Bash pro provedení daného příkazu Linuxu na skupině souborů
V následujícím příkladu funkce „batchexec“ vyhledá soubory s danou příponou a na těchto vybraných souborech provede daný příkaz.
$ function batchexec() { find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ; } $ cd ~ $ batchexec sh ls $ batchexec sh chmod 755 $ ls -l *.sh -rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh -rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh -rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh
Ve výše uvedeném příkladu najde všechny soubory skriptů shellu s příponou .sh a změní svá oprávnění na 755. (Všechna oprávnění pro uživatele, skupinu a ostatní oprávnění ke čtení a spouštění). V definici funkce si můžete všimnout „${@:2}“, které udává druhý a následující poziční parametr (funkce rozšíření shellu).
Příklad 3. Funkce Bash pro generování náhodného hesla
Následující funkce slouží ke generování náhodných silných hesel se speciálním znakem pro danou délku. Pokud není ve výchozím nastavení zadána délka, generuje se s délkou 12 znaků.
$ function rpass() { cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12} } $ rpass 6 -Ju.T[[ $ rpass Gz1f!aKN^""k
Ve výše uvedeném příkladu, když se rpass provede s argumentem 6, vygeneruje náhodné heslo se 6 znaky a rpass bez argumentu vygeneruje heslo o délce 12 znaků. ${1:-12} znamená, že pokud není $1 nastaveno nebo bude vráceno null 12, jinak bude nahrazena hodnota $1.
Příklad 4. Funkce Bash pro získání IP adresy daného rozhraní
Následující příklad definuje funkci nazvanou ‚getip‘, která přijímá název rozhraní jako argument a poskytuje IP adresu přiřazenou danému rozhraní ve stroji. (ve výchozím nastavení vrací eth0 ip adresu). Toto používá příkaz ifconfig k získání ip-adresy.
$ function getip() { /sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'; } $ getip 15.110.106.86 $ getip eth0 15.110.106.86 $ getip lo 127.0.0.1
Příklad 5. Funkce Bash pro tisk podrobností o stroji
Tento příklad definuje funkci, která poskytuje všechny požadované informace o stroji. Uživatelé mohou tuto funkci definovat a volat ve spouštěcích souborech, takže tyto informace získáte během spouštění.
$ function mach() { echo -e "\nMachine information:" ; uname -a echo -e "\nUsers logged on:" ; w -h echo -e "\nCurrent date :" ; date echo -e "\nMachine status :" ; uptime echo -e "\nMemory status :" ; free echo -e "\nFilesystem status :"; df -h } $ mach Machine information: Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux Users logged on: root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h Current date : Thu Mar 18 11:59:36 CET 2010 Machine status : 11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15 Memory status : total used free shared buffers cached Mem: 2059768 2033212 26556 0 81912 797560 -/+ buffers/cache: 1153740 906028 Swap: 4192956 48164 4144792 Filesystem status : Filesystem Size Used Avail Use% Mounted on /dev/sda1 12G 12G 0 100% / tmpfs 1006M 377M 629M 38% /dev/shm /dev/sdc5 9.9G 409M 9.0G 5% /mydisk
Příklad 6:Funkce Bash pro lepší formátování výstupu
Následující funkce vymaže obrazovku, umístí kurzor do horní části obrazovky, provede ls a poté umístí kurzor na konec obrazovky.
$ function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; } $ ll
Zobrazte kód funkce pomocí příkazu typu
type je vestavěný shell používaný k zobrazení kódu funkce.
Syntax: type function-name
$ type ll ll is a function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; alias ls="ls --color=auto -F" }
Pro snadnou orientaci získejte všech 6 funkcí zmíněných v tomto článku z tohoto ukázkového souboru funkcí .bash_profile.
Přidejte všechny tyto funkce do svého souboru ~/.bash_profile, abyste měli jistotu, že k těmto funkcím budete mít neustále přístup, aniž byste je museli pokaždé vytvářet.