天天看點

shell腳本程式設計之循環控制結構

                        shell腳本程式設計之循環控制結構

循環控制之for循環

     文法結構1

         for  Variable  in List

         do

             commands

         done

     文法結構2

         for  Variable  in List;do

這個List可以為清單、變量、指令 等等

  for循環    事先提供一個元素清單,而後,使用變量去周遊此元素清單,每通路一個元素,就執行一次循環體,直到元素通路完畢

1、for循環中的List為清單

eg1:   顯示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三個檔案各有多少行;

1

2

3

4

5

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

<code>for</code> <code>File </code><code>in</code> <code>/etc/inittab</code> <code>/etc/rc</code><code>.d</code><code>/rc</code><code>.sysinit </code><code>/etc/fstab</code><code>;</code><code>do</code>

<code> </code><code>Row=`</code><code>wc</code> <code>-l $File | </code><code>cut</code> <code>-d</code><code>' '</code> <code>-f1`</code>

<code>echo</code> <code>"$File has: $Row rows"</code>

<code>done</code>

運作結果  

<a target="_blank" href="http://blog.51cto.com/attachment/201307/151201266.png"></a>

2、for循環中的List為變量

eg2:顯示目前ID大于500的使用者的使用者名和id;

6

7

8

9

10

11

<code>useradd</code> <code>user1</code>

<code>useradd</code> <code>user2</code>

<code>useradd</code> <code>user3   </code><code>#建立幾個使用者便于測試結果</code>

<code>Id=`</code><code>cat</code> <code>/etc/passwd</code> <code>| </code><code>awk</code> <code>-F: </code><code>'{print $3}'</code><code>`</code>

<code>for</code> <code>Var </code><code>in</code> <code>$Id;</code><code>do</code>

<code>if</code> <code>[ $Var -</code><code>ge</code> <code>500 ];</code><code>then</code>

<code>  </code><code>User=`</code><code>grep</code> <code>"$Var\&gt;"</code> <code>/etc/passwd</code> <code>| </code><code>cut</code> <code>-d: -f1`</code>

<code>  </code><code>echo</code> <code>"$User uid is $Var"</code>

<code>fi</code>

<a target="_blank" href="http://blog.51cto.com/attachment/201307/154846880.png"></a>

3、for循環中的List為指令

eg3:顯示目前shell為bash的使用者的使用者名和shell。

顯示結果為 Bash user:root,/bin/bash

分析:先通過以bash結尾的shell來确定使用者,然後把這些使用者一個一個的輸出

<code>for</code> <code>Var </code><code>in</code> <code>`</code><code>grep</code> <code>"bash\&gt;"</code> <code>/etc/passwd</code> <code>| </code><code>cut</code> <code>-d: -f7`;</code><code>do</code>

<code>User=`</code><code>grep</code> <code>"$Var"</code> <code>/etc/passwd</code> <code>|</code><code>cut</code> <code>-d: -f1`</code>

<code>Shell=`</code><code>grep</code> <code>"bash\&gt;"</code> <code>/etc/passwd</code> <code>|</code><code>cut</code> <code>-d: -f7 |</code><code>uniq</code><code>`</code>

<code>for</code> <code>name </code><code>in</code> <code>$User;</code><code>do</code>

<code>echo</code> <code>"Bash user:$name,$Shell"</code>

運作結果

<a target="_blank" href="http://blog.51cto.com/attachment/201307/161840990.png"></a>

4、for循環中的List為一連串的數字

eg4:分别計算1-100以内偶數(Even number)的和,奇數(Odd number)的和.

分析:當一個數與2取餘用算時,為1則表示該數為奇數,反之為偶數。

12

<code>EvenSum=0</code>

<code>OddSum=0</code>

<code>for</code> <code>I </code><code>in</code> <code>`</code><code>seq</code> <code>1 100`;</code><code>do</code>

<code>  </code><code>if</code> <code>[ $[$I%2] -</code><code>eq</code> <code>1 ]; </code><code>then</code>

<code>    </code><code>OddSum=$[$OddSum+$I]</code>

<code>  </code><code>else</code>

<code>    </code><code>EvenSum=$[$EvenSum+$I]</code>

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

<code>echo</code> <code>"EvenSum: $EvenSum."</code>

<code>echo</code> <code>"OddSUm: $OddSum."</code>

<a target="_blank" href="http://blog.51cto.com/attachment/201307/162821665.png"></a>

5、C語言格式的for循環

eg5:添加使用者從user520添加到user530,且密碼與使用者名一樣。

<code>for</code> <code>((i=520;i&lt;=530;i++));</code><code>do</code>

<code>useradd</code> <code>user$i</code>

<code>echo</code> <code>"Add user$i."</code>

<code>echo</code> <code>user$i | </code><code>passwd</code> <code>-stdin user$i &amp;&gt;</code><code>/dev/null</code>

運作結果:(可以切換一個使用者試試密碼是否和使用者名一樣)

<a target="_blank" href="http://blog.51cto.com/attachment/201307/163851429.png"></a>

其他循環的格式如下,所有這些循環熟練掌握一種循環即可。

while循環指令的格式

      while test command

      do

             other command

      done

until循環的指令格式

    until test command

    do

          other command

    done

一個腳本的面試題 ,各位博友可以把您的答案回複在下面(大家一起交流)

    通過傳遞一個參數,來顯示目前系統上所有預設shell為bash的使用者和預設shell為/sbin/nologin的使用者,并統計各類shell下的使用者總數。

運作如  bash eg.sh  bash則顯示結果如下

BASH,3users,they are:

root,redhat,gentoo,

運作如 bash eg.sh  nologin則顯示結果如下

NOLOGIN, 2users, they are:

bin,ftp,

本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1253893,如需轉載請自行聯系原作者

繼續閱讀