function fname(){ }
或者node
function_name(){ }
對於簡單的函數,甚至能夠是這樣作 fname() { statement; }shell
直接寫函數名便可。如 fname函數
傳入的參數都是位置參數,沒法傳入形式參數以及設置默認參數,傳入位置的參數以下:命令行
fname arg1 arg2
簡單的函數例子以下:debug
fname(){ echo $1, $2; #訪問參數1和參數2 echo "$@"; #以列表的方式一次性打印全部參數 echo "$*"; #相似於$@,可是全部參數被視爲單個實體 return 0; #返回值 } fname a b
解釋下不常見的參數:code
IFS解釋:
IFS是shell腳本中的一個重要概念,在處理文本數據時,它是至關有用的。IFS能夠是White Space(空白鍵)、Tab( 表格鍵)、Enter( 回車鍵)中的一個或幾個。
IFS(Internal Field Seperator)在Linux的shell中預設的分隔符,用來把command line分解成word(字段)。
IFS的設置方法很簡單,和普通變量設置方法相似:遞歸
IFS=":"
建議設置IFS前保存原IFS的值,在使用後及時恢復。dns
經過設置別名的方法設置一個命令,而後傳入參數進去看看有什麼效果進程
[root@dns-node2 tmp]# alias lsg='ls |grep ' [root@dns-node2 tmp]# lsg sh DaoJiShi.sh debugsh.sh testFunc.sh testSet.sh
咱們再寫一個函數,接受一個位置參數,由此能夠對比下別名的位置參數和函數的位置參數資源
[root@dns-node2 tmp]# getFile(){ ls |grep $1 ;} [root@dns-node2 tmp]# getFile txt output.txt [root@dns-node2 tmp]# getFile sh DaoJiShi.sh debugsh.sh testFunc.sh testSet.sh
在Bash中,函數一樣支持遞歸調用(能夠調用自身的函數)。例如, F() { echo $1; F hello;
sleep 1; } 。
Fork炸彈
遞歸函數是可以調用自身的函數。這種函數必須有退出條件,不然就會不斷地
生成自身,直到系統耗盡全部的資源或是崩潰。
:(){ :|:& };:
這個函數會一直地生成新的進程,最終造成拒絕服務攻擊。
函數調用前的 & 將子進程放入後臺。這段危險的代碼可以不停地衍生出進程,
於是被稱爲Fork炸彈。
能夠經過修改配置文件/etc/security/limits.conf中的 nproc 來限制可生成的最
大進程數,進而阻止這種攻擊。
下面的語句將全部用戶可生成的進程數限制爲100:
hard nproc 100
經過export -f fname
導出函數, 如此一來,函數的做用域就能夠擴展到子進程中,也就是子進程也可使用這個函數了。
[root@dns-node2 tmp]# cat testExportFunc.sh getFile sh [root@dns-node2 tmp]# sh testExportFunc.sh testExportFunc.sh: line 1: getFile: command not found [root@dns-node2 tmp]# export -f getFile [root@dns-node2 tmp]# sh testExportFunc.sh DaoJiShi.sh debugsh.sh testExportFunc.sh testFunc.sh testSet.sh
讀取 $? 得到返回值,若是命令成功退出,那麼退出狀態爲0,不然爲非0。
在腳本中,命令行參數能夠依據其在命令行中的位置來訪問。第一個參數是 $1 ,第二個參數
是 $2 ,以此類推。
下面的語句能夠顯示出前3個命令行參數:
echo $1 $2 $3
更爲常見的處理方式是迭代全部的命令行參數。 shift 命令能夠將參數依次向左移動一個位
置,讓腳本可以使用 $1 來訪問到每個參數。下面的代碼顯示出了全部的命令行參數:
$ cat showArgs.sh for i in `seq 1 $#` do echo $i is $1 shift done $ sh showArgs.sh a b c 1 is a 2 is b 3 is c