在shell中如果一段代碼需要反複被調用,則可以将該段代碼定義稱為函數,直接在後面的腳本中調用即可。定義函數的方法有兩種:
1、function functionname {
}
2、functionname() {
例如:定義一個添加使用者hadoop的函數
1
2
3
4
5
6
7
8
9
<code>ADDUSER() {</code>
<code>USERNAME=hadoop</code>
<code>if</code> <code>! </code><code>id</code> <code>-u $USERNAME &> </code><code>/dev/null</code><code>; </code><code>then</code>
<code> </code><code>useradd</code> <code>$USERNAME</code>
<code> </code><code>echo</code> <code>$USERNAME | </code><code>passwd</code> <code>--stdin $USERNAME &> </code><code>/dev/null</code>
<code>fi</code>
<code>}</code>
<code>ADDUSER</code>
<code>echo</code> <code>$?</code>
<code>[root@dnsserver ~]</code><code># ./adduser.sh </code>
<code>0</code>
<code>[root@dnsserver ~]</code><code># ./adduser.sh </code>
連續兩次執行腳本,傳回的狀态值都是0,這裡有一個問題,第一次執行這個腳本,成功添加了使用者hadoop,但是第二次執行時,hadoop已經存在,那麼這個為什麼還是傳回狀态值為0?
<code>[root@dnsserver ~]</code><code># bash -x adduser.sh </code>
<code>+ ADDUSER</code>
<code>+ USERNAME=hadoop</code>
<code>+ </code><code>id</code> <code>-u hadoop</code>
<code>+ </code><code>echo</code> <code>0</code>
從上面的分析可以看出,由于腳本最後一條命名為id -u hadoop,而該指令是能成功執行的,是以傳回值是0。顯然,這是不合理的。那麼我們如果根據不同的情況,擷取不同的狀态值呢?
可以利用return指令,在函數中用return來定義函數的狀态值。
上面的腳本改成這樣:
10
11
12
13
14
15
16
17
18
<code>#!/bin/bash</code>
<code>#</code>
<code> </code><code>return</code> <code>0</code>
<code>else</code>
<code> </code><code>return</code> <code>1</code>
<code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"add user finished."</code>
<code> </code><code>echo</code> <code>"Failed"</code>
删除hadoop使用者重新執行看看結果
<code>[root@dnsserver ~]</code><code># userdel -r hadoop</code>
<code>[root@dnsserver ~]</code><code># ./adduser.sh </code>
<code>add user finished.</code>
<code>Failed</code>
第二次添加使用者hadoop的時候就報錯了。
接受參數的函數:
19
<code>USERNAME=$1</code>
<code>##調用函數時也要跟$1這個變量</code>
<code>ADDUSER $1 </code>
練習:寫一個腳本,判定192.168.0.200~192.168.0.254之間的主機哪些線上,要求:
1、使用函數來實作一台主機的判定過程:
2、在主程式中調用此函數判定指定範圍内的所有主機的線上情況
<code>PING() {</code>
<code> </code><code>if</code> <code>ping</code> <code>-c 1 -w 1 192.168.0.$I &> </code><code>/dev/null</code><code>; </code><code>then</code>
<code> </code><code>echo</code> <code>"192.168.0.$I is online."</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"192.168.0.$I is offline."</code>
<code> </code><code>fi</code>
<code>for</code> <code>I </code><code>in</code> <code>{200..254}; </code><code>do</code>
<code> </code><code>PING 192.168.0.$I</code>
<code>done</code>
執行腳本
<code>[root@dnsserver ~]</code><code># ./ping.sh </code>
<code>192.168.0.200 is offline.</code>
<code>192.168.0.201 is offline.</code>
<code>192.168.0.202 is offline.</code>
<code>192.168.0.203 is offline.</code>
這裡腳本輸出結果傳回的資訊是由函數PING來顯示的,如果不希望函數來顯示是否線上,而是由主程式來顯示,則可以利用return來改進腳本,改進後的腳本如下:
<code> </code><code>return</code> <code>0</code>
<code> </code><code>return</code> <code>1</code>
<code> </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"192.168.0.$I is online."</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"192.168.0.$I is offline."</code>
<code> </code><code>fi</code>
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1775892,如需轉載請自行聯系原作者