函數介紹
函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。
它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序 的一部分 。
函數和shell程序比較相似,區別在於:
Shell程序在子Shell中運行,而Shell函數在當前Shell中運行。
因此在當前Shell中,函數可以對shell中變量進行修改。
定義函數
函數由兩部分組成:函數名和函數體
語法一: function f_name { ...函數體... }
語法二: function f_name () { ...函數體... }
語法三: f_name (){ ...函數體... } (此語法最為常用)
函數也分為本地函數和環境函數。
set 查看本地變量及本地函數
1 [root@mmmm(mei) bin]# set 2 BASH=/bin/bash 3 BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath 4 BASH_ALIASES=() 5 BASH_ARGC=() 6 BASH_ARGV=() 7 BASH_CMDS=() 8 BASH_LINENO=()
unset 變量名或函數名 取消變量或函數的定義
本地函數
1 [root@mmmm(mei) bin]# test () { echo hello world; return 2; } 2 [root@mmmm(mei) bin]# test 3 hello world 4 [root@mmmm(mei) bin]# unset test 5 [root@mmmm(mei) bin]# test 6 [root@mmmm(mei) bin]#
環境函數
declare -xf mage或export -f mage
查看環環境函數
declare -xf 或export -f
1 [root@mmmm(mei) bin]# declare -xf test 2 [root@mmmm(mei) bin]# declare -xf 3 [root@mmmm(mei) bin]# test () { echo hello world; return 2; } 4 [root@mmmm(mei) bin]# declare -xf test 5 [root@mmmm(mei) bin]# declare -xf 6 test () 7 { 8 echo hello world; 9 return 2 10 } 11 declare -fx test
函數使用
函數的定義和使用:
(1)可在交互式環境下定義函數
1 [root@mmmm(mei) ~]# test () { 2 > echo hello world 3 > } 4 [root@mmmm(mei) ~]# test 5 hello world
(2)可將函數放在腳本文件中作為它的一部分
1 1 #!/bin/bash 2 2 test () { 3 3 echo hello world 4 4 } 5 5 test
在此需要注意一點:
當我們需要使用函數時,直接使用函數名即可,函數名會被自動替換為函數代碼 。
但建議將函數部分的代碼寫在調用函數前面,使得在解釋腳本時不報錯。
(3)可放在只包含函數的單獨文件中 ,可以在其他腳本中調用該文件的函數
函數是在被調用時創建,返回時終止。那么函數的返回值是什么呢?
函數的返回值也分為兩種情況:
1.函數的執行結果返回值:
(1) 使用echo等命令進行輸出
(2) 函數體中調用命令的輸出結果
2.函數的退出狀態碼:
(1) 默認取決於函數中執行的最后一條命令的退出狀態碼
1 [root@mmmm(mei) bin]# test () { 2 > echo hello world 3 > } 4 [root@mmmm(mei) bin]# test 5 hello world 6 [root@mmmm(mei) bin]# echo $? 7 0
(2) 自定義退出狀態碼,
其格式為: return 從函數中返回,用最后狀態命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回
1 [root@mmmm(mei) bin]# test () { 2 > echo hello world 3 > return 2 4 > } 5 [root@mmmm(mei) bin]# test 6 hello world 7 [root@mmmm(mei) bin]# echo $? 8 2
接下來我們舉一個簡單的小例子來介紹一些函數的用法
declare -i num=100 使num的賦值只在當前函數中有效,等於同local num=100
1 1 #!/bin/bash 2 2 test() { 3 3 declare -i num=$1 4 4 if [ $1 -le 1 ]; then 5 5 echo -e "hello\n" 6 6 else 7 7 echo no 8 8 echo $(test $[$num-1]) 9 9 10 10 fi 11 11 echo $num 12 12 } 13 13 test $1 14 14 echo $num 15 [root@mmmm(mei) bin]# testhanshu.sh 2 16 no 17 hello 1 18 2