天天看點

shell進階用法--函數

在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 &amp;&gt; </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 &amp;&gt; </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 &amp;&gt; </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,如需轉載請自行聯系原作者