函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。
函數和shell程序比較相似,區別在于:
(1)Shell程序在子Shell中運行。
(2)而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改。
注意:必須在調用函數地方之前,聲明函數,shell腳本是逐行運行。函數的生命周期;每次被調用時創建,返回時終止
1) 定義函數的代碼段不會自動執行,在調用時執行;所謂調用函數,在代碼中給定函數名即可;
2) 函數名出現的任何位置,在代碼執行時,都會被自動替換為函數代碼;
=========================================================
定義函數的格式
函數名()
{
命令1
. . .
}
或者
函數名(){
命令1
. . .
}
==========================================================
兩者方式都可行。如果愿意,可在函數名前加上關鍵字f u n c t i o n,這取決于使用者。
f u n c t i o n 函數名()
{ …
}
可以將函數看作是腳本中的一段代碼,但是有一個主要區別。執行函數時,它保留當前
s h e l l和內存信息。此外如果執行或調用一個腳本文件中的另一段代碼,將創建一個單獨的
s h e l l,因而去除所有原腳本中定義的存在變量。
在腳本中定義函數
hello(){ echo "hello today is `date`" }
在腳本中使用函數
#!/bin/bash # # hello(){ echo "hello today is `date`" } echo "the is call function" hello echo "call function finish"
執行結果
the is call function hello today is 2016年 08月 22日 星期一 09:44:22 CST call function finish
函數返回值:
函數的執行結果返回值:
(1)使用echo或者printf命令進行輸出;
(2)函數體中調用的命令的執行結果;
函數的退出狀態碼:
(1)默認取決于函數體中執行的最后一條命令的退出狀態碼;
(2)自定義:return
傳遞參數給函數;
在函數體中,可以使用$1,$2…引用傳遞給函數的參數;還可以在函數中使用$*或$@引用所有參數,$#引用傳遞的參數的個數;
在調用函數時,在函數名后面以空白符分割給定參數列表即可,例如, testfunc arg1 agr2 arg3…
#!/bin/bash # # return 1: user exists [ $# -lt 1 ] && echo "enter noe username" && exit 1 adduser(){ if id $1 &> /dev/null;then return 1 else useradd $1 retval=$? return $retval fi } for i in {1..100};do adduser ${1}${i} retval=$? if [ $retval -eq 0 ];then echo "add user ${1}${i} finished" elif [ $retval -eq 1 ];then echo "user ${1}${i} exists" else echo "unkown error" fi done
變量作用域:
局部變量:作用域是函數的生命周期;在函數結束時被自動銷毀
定義局部變量的方法;local variable=value
本地變量:作用域是運行腳本的shell進程的生命周期;因此,其作用范圍為當前shell腳本進程
#!/bin/bash # # name=tom setname(){ local name=jerry echo "function:$name" } setname echo "shell: $name"
如果不使用local就會出現如下情況
#!/bin/bash # # name=tom setname(){ name=jerry echo "function:$name" } setname echo "shell: $name"
執行結果
function:jerry shell: jerry
數組
數組:
數組:存儲多個元素的連續的內存空間;
數組名:整個數組只有一個名字;
數組索引:編號從0開始
引用方式:數組名【索引】
${array_name[index]}
注意:bash-4及之后的版本,支持自定義索引格式,而不僅僅是0.12,…數字格式
此類數組稱之為“關聯數組”
聲明數組:
declare -a NAME:聲明索引數組;
declare -A NAME:聲明關聯數組:(必須先聲明,再使用)
數組中元素的賦值方式:
(1)一次只賦值一個元素
ARRY_NAME[index]=value
]#name[0]=ali ]#echo $name ali
(2)一次賦值全部元素;
arry_name=("val1" "val2" "val3"….)
]#name=(ali Aisha mohamed) ]#echo ${name[*]} ali Aisha mohamed
(3)只賦值特定元素;
arry_name=([0]="val1" [3]="val4"…)
]#name=([0]=ali [3]=mohamed) ]#echo ${name[*]} ali mohamed
注意:bash支持稀疏格式的數組
(4)read -a arry_name
]#read -a name Aisha ali mohamed ]#echo ${name[*]} Aisha ali mohamed
引用數組中的元素:${arry_name[index]}
注意:引用時,只給數組名,表示下標為0的元素
]#echo ${name} Aisha
${arry_name[*]}:引用數組中的所有元素
${arry_name[@]}:
]#echo ${name[*]} Aisha ali mohamed
數組的長度(數組中的元素的個數);
${#arry_name[*]}
${#arry_name[@]}
]#echo ${#name[*]} 3
數組元素切片:${arry_name[@]:offset:number}
offset:要跳過的元素個數;
number:要取出的元素個數;省略number時,表示取偏移量之后的所有元素;
向非稀疏格式數組中追加元素
arry_name[${#arry_name[*]}]=
刪除數組中的某元素
unset arry[index]
關聯數組;
declare -A arry_name
arry_name=([index_name1]="value1" [index_name2]="value2"…)
完
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/38783