天天看點

linux下shell腳本程式設計2

1、 if 判斷一些特殊用法

if [ -z $a ]  這個表示當變量a的值為空時會怎麼樣

if [ ! -e file ]; then 表示檔案不存在時會怎麼樣

if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=這樣的符号

$3不存在,是以n為空;判斷是否為空;

1

2

3

4

5

<code>[root@yong ~]</code><code># n=`wc -l /etc/passwd|awk '{print $3}'`</code>

<code>[root@yong ~]</code><code># echo $n</code>

<code>[root@yong ~]</code><code># if [ -z $n ];then echo "\$n is null";fi</code>

<code>$n is null</code>

if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行時會怎麼樣?

1.txt中含有123;grep -q '123' 1.txt 比對OK,傳回值為真;

<code>[root@localhost shell]</code><code># cat 1.txt</code>

<code>123</code>

<code>sdwe</code>

<code>[root@localhost shell]</code><code># if grep -q "123" 1.txt ;then echo kong;fi</code>

<code>kong</code>

2、 shell中的case判斷

6

7

8

9

10

11

12

13

14

15

16

<code>格式: </code><code>case</code>  <code>變量名 </code><code>in</code>

<code>                     </code><code>value1)</code>

<code>                          </code><code>command</code>

<code>                          </code><code>;;</code>

<code>                     </code><code>value2)</code>

<code>                      </code><code>*)</code>

<code>                        </code><code>commond</code>

<code>                            </code><code>;;</code>

<code>                      </code><code>esac</code>

<code>在</code><code>case</code><code>程式中,可以在條件中使用 |,表示或的意思, 比如</code>

<code>2|3)</code>

<code>    </code><code>command</code>

<code>    </code><code>;;</code>

<code>當變量為2或者3時,執行該部分指令。</code>

/etc/init.d/naginx 裡面有case語句;比對輸入的第一個參數是否為start stop reload restart conifgtest,輸入其他字元則傳回

Usage: /etc/init.d/nginx {start|stop|reload|restart|configtest}

17

18

19

20

<code>case</code> <code>"$1"</code> <code>in</code>

<code>  </code><code>start)</code>

<code>        </code><code>start</code>

<code>        </code><code>;;</code>

<code>  </code><code>stop)</code>

<code>        </code><code>stop</code>

<code>  </code><code>reload)</code>

<code>        </code><code>reload</code>

<code>  </code><code>restart)</code>

<code>        </code><code>restart</code>

<code>  </code><code>configtest)</code>

<code>        </code><code>configtest</code>

<code>  </code><code>*)</code>

<code>        </code><code>echo</code> <code>$</code><code>"Usage: $0 {start|stop|reload|restart|configtest}"</code>

<code>        </code><code>RETVAL=1</code>

<code>esac</code>

舉例,輸入的是字母,提示輸入一個純數字,輸入數字判斷是偶數或奇數;

21

22

23

24

<code>[root@localhost 0618]</code><code># cat case1.sh </code>

<code>#!/bin/bash</code>

<code>#要求輸入的是數字,判斷奇數或偶數;非數字則提示輸入數字,然後退出;</code>

<code>read</code> <code>-p </code><code>"please input a number:"</code> <code>n</code>

<code>n1=`</code><code>echo</code> <code>$n|</code><code>sed</code> <code>'s/[0-9]//g'</code><code>`</code>

<code>#輸入為數字則sed替換為空,傳回值為空;輸入為字母則傳回值不為空;</code>

<code>if</code> <code>[ ! -z $n1 ]</code>

<code>then</code>    

<code>    </code><code>echo</code> <code>"please input a number "</code>    

<code>exit</code> <code>1</code>

<code>fi</code>

<code>n2=$[$n%2]</code>

<code>case</code> <code>$n2 </code><code>in</code>

<code>   </code><code>0)</code>

<code>    </code><code>echo</code> <code>"偶數"</code>

<code>    </code><code>;;    </code>

<code>   </code><code>1)        </code>

<code>    </code><code>echo</code> <code>"奇數"</code>        

<code>   </code><code>*)        </code>

<code>    </code><code>echo</code> <code>"不存在"</code>        

<code>[root@localhost 0618]</code><code># sh -x case1.sh </code>

<code>+ </code><code>read</code> <code>-p </code><code>'please input a number:'</code> <code>n</code>

<code>please input a number:</code>

<code>de2</code>

<code>++ </code><code>echo</code> <code>de2</code>

<code>++ </code><code>sed</code> <code>'s/[0-9]//g'</code>

<code>+ n1=de</code>

<code>+ </code><code>'['</code> <code>'!'</code> <code>-z de </code><code>']'</code>

<code>+ </code><code>echo</code> <code>'please input a number '</code>

<code>please input a number </code>

<code>+ </code><code>exit</code> <code>1</code>

<code>[root@localhost 0618]</code><code># sh case1.sh </code>

<code>please input a number:234</code>

<code>偶數</code>

<code>please input a number:we</code>

<code>please input a number</code>

case實驗2:輸入為空則提示輸入數字然後退出;輸入的數字在0-100内判斷成績;輸入為非數字則提示輸入數字然後退出;

輸入負數和大于100的都會提示輸入的數字為0-100;

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<code>#!/bin/bash#case實驗,輸入為空提示輸入數字然後退出;輸入的數字在0-100内判斷成績;輸入的非數字提示輸入數字然後退出;</code>

<code>if</code> <code>[ -z $n ]</code>

<code>    </code><code>echo</code> <code>"Please input a number"</code>    

<code>    </code><code>exit</code> <code>1</code>

<code>n1=`</code><code>echo</code> <code>$n|</code><code>sed</code> <code>'s/[-0-9]//g'</code><code>`</code>

<code>#sed替換加了-表示負數;</code>

<code>then</code>

<code>    </code><code>echo</code> <code>"please input a number "</code>

<code>if</code> <code>[ $n -</code><code>ge</code> <code>0 ] &amp;&amp; [ $n -lt 60 ]</code>

<code>    </code><code>tag=1</code>

<code>elif</code> <code>[ $n -</code><code>ge</code> <code>60 ] &amp;&amp; [ $n -lt 80 ]</code>

<code>    </code><code>tag=2</code>

<code>elif</code> <code>[ $n -</code><code>ge</code> <code>80 ] &amp;&amp; [ $n -lt 90 ]</code>

<code>    </code><code>tag=3</code>

<code>elif</code> <code>[ $n -</code><code>ge</code> <code>90 ] &amp;&amp; [ $n -</code><code>le</code> <code>100 ]</code>

<code>    </code><code>tag=4</code>

<code>else</code>

<code>    </code><code>tag=0</code>

<code>case</code> <code>$tag </code><code>in</code>

<code>    </code><code>1)</code>

<code>        </code><code>echo</code> <code>"不及格"</code>

<code>        </code><code>;;    </code>

<code>    </code><code>2)        </code>

<code>        </code><code>echo</code> <code>"及格"</code>       

<code>        </code><code>;;          </code>

<code>    </code><code>3)        </code>

<code>       </code><code>echo</code> <code>"良好"</code>        

<code>       </code><code>;;    </code>

<code>    </code><code>4)        </code>

<code>       </code><code>echo</code> <code>"優秀"</code>        

<code>    </code><code>*)        </code>

<code>       </code><code>echo</code> <code>"輸入的數字為0-100"</code>        

<code>       </code><code>;;</code>

<code>[root@localhost 0618]</code><code># sh case2.sh </code>

<code>please input a number:-200</code>

<code>輸入的數字為0-100</code>

<code>please input a number:101</code>

3、 shell腳本中的循環

for循環 文法結構:for  變量名 in 條件; do … done

while 循環文法結構: while 條件; do … done 死循環用:表示

break直接結束本層循環; continue忽略continue之下的代碼,直接進行下一次循環

exit 直接退出shell

for循環實驗:列出/etc目錄下所有的目錄

<code>[root@yong ~]</code><code># cat for.sh </code>

<code>for</code> <code>f </code><code>in</code> <code>`</code><code>ls</code> <code>/etc/</code><code>`</code>

<code>do</code>

<code>if</code> <code>[ -d </code><code>/etc/</code><code>$f ]</code>

<code>       </code><code>ls</code> <code>-d </code><code>"/etc/$f"</code>

<code>done</code>

while循環實驗:判斷負載的循環;

<code>[root@yong ~]</code><code># cat load.sh </code>

<code>#監測負載的腳本,取w負載1分鐘内的負載值如果大于10,則30秒發一次郵件;</code>

<code>while</code> <code>:</code>

<code>load=`w |</code><code>head</code> <code>-1 |</code><code>awk</code> <code>-F </code><code>"load average: "</code> <code>'{print $2}'</code><code>|</code><code>cut</code> <code>-d. -f1`</code>

<code>if</code> <code>[ $load -gt 10 ]</code>

<code>    </code><code>top</code><code>|mail -s </code><code>"load is high:$load"</code> <code>[email protected]</code>

<code>    </code><code>exit</code> <code>0</code>

<code>    </code><code>sleep</code> <code>30</code>

while循環實驗:

如果輸入為空,提示要求輸入東西,如果輸入字元提示輸入純數字,輸入純數字列印數字,退出;

<code>[root@localhost 0618]</code><code># cat while.sh </code>

<code>#輸入為空,提示輸入東西一直到輸入不為空結束;如輸入的是字母則提示隻能輸入一個純數字,直到輸入純數字為止,列印數字結束;</code>

<code>    </code><code>read</code> <code>-p </code><code>"please input a number:"</code> <code>n</code>

<code>    </code><code>if</code> <code>[ -z $n ]</code>

<code>    </code><code>then</code>

<code>        </code><code>echo</code> <code>"請輸入一個東西"</code>

<code>    </code><code>continue</code>

<code>    </code><code>n1=`</code><code>echo</code> <code>$n | </code><code>sed</code> <code>'s/[-0-9]//g'</code><code>`</code>

<code>    </code><code>if</code> <code>[ ! -z $n1 ]</code>

<code>        </code><code>echo</code> <code>"請輸入一個純數字"</code>

<code>    </code><code>break</code>

<code>echo</code> <code>$n</code>

continue 退出本次循環;循環内部繼續,不執行循環後面的了;

break跳出整個循環,循環後面的還會執行。

exit的話退出整個腳本;

break實驗:條件比對的話退出整個循環;

<code>[root@localhost 0618]</code><code># cat break.sh </code>

<code>#break實驗;條件比對的話退出整個循環;循環後面的還會執行;</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 5`</code>

<code>    </code><code>echo</code> <code>$i    </code>

<code>    </code><code>if</code> <code>[ $i == 3 ]</code>

<code>then</code>        

<code>        </code><code>break</code>    

<code>echo</code> <code>$i</code>

<code>echo</code> <code>OK</code>

<code>[root@localhost 0618]</code><code># sh break.sh</code>

<code>1</code>

<code>2</code>

<code>3</code>

<code>OK</code>

continue實驗;條件比對的話退出本次循環,繼續執行循環;

<code>    </code><code>echo</code> <code>$i</code>

<code>    </code><code>then</code>        

<code>        </code><code>continue</code> 

<code>    </code><code>fi</code>

<code>[root@localhost 0618]</code><code># sh continue.sh </code>

<code>4</code>

<code>5</code>

exit實驗;條件比對的話退出整個腳本;

<code>        </code><code>exit</code> <code>1</code>

<code>[root@localhost 0618]</code><code># sh break.sh </code>

4、shell中的函數

函數就是把一段代碼整理到了一個小單元中,并給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可。

格式: function f_name() {

                      command

             }

函數必須要放在最前面

函數裡可以export 全局變量;

函數實驗1:定義input函數,輸入一個字元,則列印一個字元;

<code>input(){</code>

<code>    </code><code>echo</code> <code>$1</code>

<code>    </code><code>}</code>

<code>input yonglinux</code>

<code>[root@yong ~]</code><code># sh 1.sh </code>

<code>yonglinux</code>

函數實驗2:定義sum函數,進行求和運算;

<code>sum</code><code>() {</code>

<code>    </code><code>s=$[$1+$2]</code>

<code>    </code><code>echo</code> <code>$s</code>

<code>}</code>

<code>sum</code> <code>1 2</code>

<code>[root@localhost 0618]</code><code># sh 2.sh </code>

檢視ip位址的函數;

<code>#檢視ip位址的函數;輸入一個網卡名,輸出網卡對應的ip位址;$1為互動時輸入的網卡名;</code>

<code>ip() {</code>

<code>    </code><code>ifconfig</code> <code>|</code><code>grep</code> <code>-A1 </code><code>"$1"</code><code>|</code><code>tail</code> <code>-1|</code><code>awk</code> <code>'{print $2}'</code><code>|</code><code>awk</code> <code>-F </code><code>':'</code> <code>'{print $2}'</code>

<code>read</code> <code>-p </code><code>"please input the eth name:"</code> <code>e</code>

<code>myip=`ip $e`</code>

<code>echo</code> <code>"$e address is $myip"</code>

<code>please input the eth name:eth0</code>

<code>eth0 address is 192.168.11.100</code>

<code>please input the eth name:eth1</code>

<code>eth1 address is 192.168.20.100</code>

<code>please input the eth name:lo</code>

<code>lo address is 127.0.0.1</code>

本文轉自 模範生 51CTO部落格,原文連結:http://blog.51cto.com/mofansheng/1664557,如需轉載請自行聯系原作者

繼續閱讀