Shell函數——《Linux日常》

1. Shell函數的好處

1. 簡化程序代碼,實現代碼重用

  • 實現一次定義多次調用。如:is_root_user()函數可 以由不同的shell腳本重複使用。

2. 實現結構化編程

  • 使腳本內容更加簡潔,增強程序的易讀性

3. 提高執行效率

  • 將常用的功能定義爲多個函數並將其保存在一個文件中,類似其他語言的“模塊”文件
  • ~/bashrc 裏或命令行上使用 source 命令調用這個文件
  • 此文件中定義的多個函數一次性地調入內存,從而加快運行速度

2. 函數的定義和調用

1. 函數定義

function 函數名 { commands }

函數名 () { commands }

2. 函數調用

只需輸入函數名即可調用函數,函數必須在調用之前定義

函數名
函數名 參數1 參數2 …

3. 函數的存儲和顯示

1. 函數的存儲

  • 函數和調用它的主程序保存在同一個文件中

    函數的定義必須出現在調用之前

  • 函數和調用它的主程序保存在不同的文件中

    保存函數的文件必須先使用 source 命令執行,之後才 能調用其中的函數

2. 函數的顯示

  • 顯示當前Shell可見的所有函數名

    $ declare -F
    
  • 顯示當前Shell可見的所有(指定)的函數定義

    $ declare -f 
    $ declare -f  <functionName> 
    

4. 函數的調用舉例

  • 函數和調用它的主程序保存在同一個文件中
#!/bin/bash 
## filename: function-1.sh 
### User define Function (UDF) ### 
sql_bak () { echo "Running mysqldump tool..."; } 
sync_bak () { echo "Running rsync tool..."; } 
git_bak () { echo "Running gistore tool..."; } 
tar_bak () { echo "Running tar tool..."; } 
### Main script starts here ### 
PS3="Please choose a backup tools : " 
select s in mysqldump rsync gistore tar quit ; do 
	case $REPLY in
    	1) sql_bak  ;; 
    	2) sync_bak ;; 
    	3) git_bak  ;; 
    	4) tar_bak  ;; 
    	5) exit     ;; 
	esac 
done
  • 函數和調用它的主程序保存在不同的文件
#!/bin/bash 
## filename: function-2.sh 
### User define Function (UDF) ### 

sql_bak () { echo "Running mysqldump tool..."; } 
sync_bak () { echo "Running rsync tool..."; } 
git_bak () { echo "Running gistore tool..."; } 
tar_bak () { echo "Running tar tool..."; } 
#!/bin/bash 
source /root/bin/function-2.sh 

### Main script starts here ### 
PS3="Please choose a backup tools : " 
select s in mysqldump rsync gistore tar quit ; do
	case $REPLY in 
		1|[mM]ysqldump) sql_bak  ;; 
		2|[rR]sync)     sync_bak ;; 
		3|[gG]istore)   git_bak  ;; 
		4|[tT]ar)       tar_bak  ;; 
		5) exit     ;; 
	esac 
done

5. 參數與變量

1. 參數

  • 調用函數時,使用位置參數的形式爲函數傳遞參數
  • 函數內的$1-${n}、$*和$@表示接收到的參數
    • $1-${n}表示第n個參數
    • $*表示將所有位置參量看成一個字符串
    • $@表示將每個位置參量看成單獨的字符串(以空格間隔)
  • 函數調用結束後位置參數$1-${n}、 $* 和 $@ 將被重置爲調用函數之前的值
  • 在主程序和函數中,$0始終代表腳本名

2. 變量

  • 函數內使用 local 聲明的變量是局部變量

    局部變量的作用域是當前函數以及其調用的所有函數

  • 函數內未使用 local 聲明的變量是全局變量

    主程序和函數中的同名變量是一個變量(地址一致)

6. 函數的結束和返回值

  • 當函數的最後一條命令執行結束,函數結束

    • 函數的返回值就是最後一條命令的退出碼
    • 其返回值被保存在系統變量$?
  • 可以使用return 或exit顯示地結束函數

    • return [N]
      • return將結束函數的執行
      • 可以使用N指定返回值
    • exit [N]
      • exit將中斷當前函數和當前Shell的執行
      • 可以使用N指定返回值

return只能返回整數值,可以使用標準輸出實現函數的返回值

  • 標準輸出實現函數的返回值

    • 通用的方法,既能返回整數又能返回字符串
    • 函數結束前使用 echo 命令將結果顯示到標準輸出
    • 調用函數時使用如下的格式將函數的輸出結果存到變量RES中,之後便可使用變量$RES的值

7. 標準輸出實現函數的返回值舉例

#!/bin/bash 
# User define Function (UDF) 
to_upper () { 
	local str="$@" 
	local output 
	output=$(tr '[a-z]' '[A-Z]'<<<"${str}") 
	echo $output 
} 

### Main script starts here ### 
to_upper "This Is a TEST" 
res=$(to_upper "$@") 
echo "$res" 

res=$(to_upper "$1") 
[[ $res == "YES" ]] && echo "Continue..." || echo "Stop" 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章