函數是代碼重用的最重要方式。Bash函數可以定義為一組命令,在bash腳本中多次調用。
bash函數使腳本更具可讀性,并避免一次又一次地編寫相同的代碼。它還允許開發人員將復雜而冗長的代碼分解為小部分,可以在需要時調用它們??梢噪S時重復調用函數,這樣就能夠重用,優化和最小化代碼。
1. 函數聲明
bash函數必須先聲明,然后才能使用它。函數的聲明有兩種格式:
# 第一種方法:以函數名稱開頭,后跟括號。
function_name () {
commands
}
# 第二種方法:以函數保留字開頭,后跟函數名稱。
function function_name {
commands
}
2. 函數參數
可以往bash函數中傳遞參數來處理數據,只需要把要傳遞的數據放在調用的函數名稱之后,在函數名稱和參數之間使用空格,為了防止參數解析錯誤,建議在參數周圍使用雙引號。
給定的參數以$1,$2,$3,...$n的形式訪問,對應于函數名后參數的位置。
$0變量的值是函數的名稱。
$#變量用于保存賦予函數的位置參數的數量。
*** 和**@ 變量用于保存賦予函數的所有參數。當** * 與雙引號(即"** * ")一起使用時,它將擴展為一個由空格分隔的字符串。例如,"$1 $2 n"等。當@與雙引號(即"** @")一起使用時,它將擴展為單獨的字符串。例如,"$1" "$2" "n"等。當和*#不與雙引號一起使用時,它們都是相同的。
例子如下:
# The script is:
function_name () {
echo "the function is called"
echo '$0 is' $0
echo '$1 is' $1
echo '$2 is' $2
echo '$# is' $#
echo '$*' is $*
echo '$@' is $@
}
function_name first second third
# The result is:
the function is called
$0 is ./bash_ex.sh
$1 is first
$2 is second
$# is 3
$* is first second third
$@ is first second third
3. 函數返回值
Bash函數不提供在調用時返回值的支持,但是,它們允許設置返回狀態,這種狀態類似于程序或命令如何以退出狀態退出。bash函數完成時,其返回值是函數中最后執行的語句的狀態。對于成功狀態,它將返回0,對于失敗,將返回1-255范圍內的非零十進制數。
可以使用關鍵字return指示返回狀態,并將它分配給變量$?。return語句終止函數并用作函數的退出狀態。
例子如下:
# The script is:
func_return () {
echo "the function is called"
return 6
}
func_return
echo "func_return status: $?"
# The result is:
the function is called
func_return status: 6
從函數返回值的另一個更好的選擇是使用echo或printf命令將打印值發送到stdout,如下腳本代碼所示:
# The script is:
func_print () {
local it="Welcome!!!"
echo "$it"
}
my="$(func_print)"
echo $my
# The result is:
Welcome!!!
4. 變量的作用域
全局變量定義為可以在腳本內的任意位置訪問的變量,而不管它的范圍如何。默認情況下,所有變量都定義為全局變量,即使它們在函數內部聲明也是如此。
還可以將變量創建為局部變量??梢允褂胠ocal關鍵字在函數體內聲明局部變量。首次分配關鍵字時。
它們只能在該函數內部訪問??梢栽诓煌暮瘮抵袆摻ň哂邢嗤Q的局部變量。要添加局部變量,語法如下:
local var_name=< var_value >
例子如下:
# The script is:
v1='A'
v2='B'
test_local_var () {
local v1='C'
v2='D'
echo "test_local_var Function"
echo "v1 is $v1."
echo "v2 is $v2."
}
echo "Before Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
test_local_var
echo "After Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
# The result is:
Before Executing the Function
v1 is A.
v2 is B.
test_local_var Function
v1 is C.
v2 is D.
After Executing the Function
v1 is A.
v2 is D.
5. 覆蓋命令
可以通過創建與要覆蓋的命令同名的函數來覆蓋bash命令。例如,如果想覆蓋echo命令,那么只需要創建一個名稱為echo的函數即可。
覆蓋bash命令的概念在某些情況下可能會很有用,例如當要使用帶有特定選項的命令時,或者當我們不喜歡在腳本中多次為整個命令提供選項時。在這種情況下,可以將內置bash命令覆蓋為帶選項的命令。
例子如下:
# The script is:
echo () {
builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "
builtin echo $1
}
echo "Welcome to Official Accounts"
# The result is:
[09-29 21:56:10] : Welcome to Official Accounts
從上面例子可以看出,echo輸出會附帶上時間信息。
-
Shell
+關注
關注
1文章
366瀏覽量
23412 -
bash終端
+關注
關注
0文章
7瀏覽量
2002
發布評論請先 登錄
相關推薦
評論