shell腳本之函數的使用


把代碼封裝成函數,相當於造了一個“輪子”,之后就直接重復使用即可。

 

函數的創建

shell中函數的創建有2種方式

1.使用function關鍵字

語法

function test {
    ...
}

2.使用括號

語法

test() {
    ...
}

 

函數的調用

記住三點即可。

1.調用方法

直接寫函數名

test

2.先定義后調用

3.對於同名的函數,后面的會覆蓋前面的

 

函數的返回值

使用默認的退出狀態碼有bug,所以推薦自定義退出碼的方式。

 

test(){
    ...
    return 5
}
test
echo $?

 

 注意點

1.函數一調用完成就馬上使用返回值(因為$?會顯示上一條語句的返回值)

2.返回值范圍在0~255

 

函數做為變量的值

編程語言中,將函數調用賦值給變量是很常見的事,但是shell中的情況有些不太一樣

1.當函數調用賦值給變量時,並不會執行函數

2.函數的第一個echo語句的結果會被賦值給變量,剩下echo 語句或者代碼正常執行

3.返回值並不會賦值給變量

function test {
	echo 1
	echo 2
	return 6
}
echo 11
t=$(test)
echo "t: $t"
echo hello

 結果

11 t: 1
2 hello

 

向函數傳遞參數

記住以下幾點

1.在腳本中調用函數時,必須將參數和函數調用放在同一行

2.在函數中,可以使用參數的環境變量來獲取參數值

3.腳本在命令行中的參數值,需要在調用函數時一起傳入

function test {
	echo $1
	echo $2
	return 6
}
test $1 $2

 結果

u
me

注意:

這里函數中$1和$2和調用時的含義不一樣。

函數中的$1和$2指向腳本中函數調用時的參數;而調用時的$1和$2指向命令行中的參數

 

在函數中使用變量

在函數中定義局部變量要使用local關鍵字

 

local test

 

 

向函數中傳遞數組

將數組中的元素分解開,之后在函數內部進行重組

function testit {
	local newarray
	newarray=(;'echo "$@"')
	echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}

 結果

The original array is 1 2 3 4 5 The new array value is: 1 2 3 4 5

 

創建庫文件

庫文件可以實現一次定義函數,終生使用

庫文件

a() {
	echo ni
} 

 腳本文件

#!/bin/bash

. ./library

 

在命令行使用函數

單行方式

function test { ...; }

注意:tset之后必須有空格,語句結尾要加;。

多行方式

function test { >... >... >}

注意:如果函數名和內置命令沖突,那么會覆蓋內置命令!

 

在.bashrc中使用函數

直接在.bashrc文件中定義函數或者載入庫文件即可。

 

使用shtool公共函數庫

 下載

傳送門:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
安裝

tar xf shtool... cd shtool... ./configure make
make test #測試

 

shtool庫文件

語法

shtool [options] [function [options] [args]]
shtool platform --help Usage: shtool platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc <string>] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type <type>] [-V|--version] [-h|--help]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM