天天看點

bash shell基本文法之函數前言函數

前言

本文對shell中函數的定義、使用、傳回值等作一個示例說明

函數

定義

bash shell函數的定義需要使用function來聲明,格式如下:

function function_name

{

    ....相關代碼/指令

}

上面的寫法是在bash shell中,其它shell可能不支援,比如dash就不能識别function。

除了上面那種寫法,還有另一種寫法:

function_name()

{

    ...相關代碼/指令

}

在函數名後面加一對英文括号()來聲明(這個在bash和dash通用,其它的腳本沒用過)。

function_name是函數名,必須是唯一的。函數需要先定義後使用。

使用

使用的時候,就像執行一個指令一樣,調用函數名即可(不要像其它語言如c一樣加括号)。示例如下:

#! /bin/bash

#定義函數hello
function hello
{
	echo "hello, world!"
}
#調用函數hello
hello

#定義函數hello2
hello2()
{
	echo "hello, world2!"
}
#調用函數hello2
hello2
           

執行結果如下:

bash shell基本文法之函數前言函數

函數名重複

上面函數定義提到函數名必須唯一,如果不唯一呢,作個驗證,将上面的示例代碼改下,兩個函數名改成一樣:hello,如下:

#! /bin/bash

#定義函數hello
function hello
{
	echo "hello, world!"
}
#調用函數hello
hello

#定義函數hello2
function hello
{
	echo "hello, world2!"
}
#調用函數hello2
hello
           

看下執行結果:

bash shell基本文法之函數前言函數

重名的話,後面定義的函數把前面的定義覆寫了

函數參數用法

即使函數要傳遞參數,函數的定義還是上面定義的格式。調用函數時想要傳遞參數,用法就和執行腳本一樣,在調用函數後以空格分隔設定參數,如下:

function_name arg1 arg2 arg3 ...

如果想要在函數體内獲得參數值,使用位置變量獲得,需要了解位置變量可以看bash shell基本文法之特殊變量的使用中位置參數這一部分的内容。

示例如下:

#! /bin/bash

#定義函數hello
hello()
{
	echo "腳本名: $0"
	#列印前3個參數的值
	echo "hello, $1 $2 $3"
}
#調用函數hello
hello 小明 小紅
           

注意一下,這裡$0的值是執行的腳本的名字,可不是調用的函數名。擷取3個參數,但是我隻傳遞了兩個,那個後面的就是空了,執行結果如下:

bash shell基本文法之函數前言函數

注意一下,雖然腳本第一行我聲明的#!使用bash來解釋,但是執行的時候,我是直接使用bash解釋執行的,也就是說#!聲明不生效的,這是為了$0可以獲得執行的目前腳本的名字。

函數傳回值 

函數的傳回值需要注意以下3點:

1. 函數的傳回值可以使用$?擷取,來表示函數的調用狀态:成功/失敗。預設傳回值情況下:0表示成功,非0表示失敗,就像指令一樣,如下:

#! /bin/bash

#定義函數hello
hello()
{
	echo "腳本名: $0"
	#列印前3個參數的值
	echo "hello, $1 $2 $3"
}
#調用函數hello
hello 小明 小紅
echo "函數執行結果:$?"
           

執行結果:

bash shell基本文法之函數前言函數

2. 使用return傳回特定的狀态碼,但是這個值必須在0-255之間,如下:

#! /bin/bash

less_than_0()
{
	return -1
}

between_0_255()
{ 
	return 100
}

eq_255()
{
	return 255
}

greater_than_255()
{
	return 256
}
less_than_0
echo "less_than_0: $?"
between_0_255
echo "between_0_255: $?"
eq_255
echo "eq_255: $?"
greater_than_255
echo "greater_than_255: $?"
           

執行結果:

bash shell基本文法之函數前言函數

不在0-255的用其它值代替。

3. 如果這個傳回值不是一個數字,而我們用$?擷取這個結果,如下:

#! /bin/bash

fun_string_test()
{
	return "hello,world"
}
fun_string_test
echo "fun_string_test: $?"
           

執行結果:

bash shell基本文法之函數前言函數

調用失敗,傳回值必須是數字類型

繼續閱讀