shell基礎知識5-函數

函數的定義

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

  1. "$@" 被擴展成 "$1" "$2" "$3" 等。
  2. "$*" 被擴展成 "$1c$2c$3" ,其中 c 是IFS的第一個字符。

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
相關文章
相關標籤/搜索