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\>"</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\>"</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\>"</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<=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 &></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,如需轉載請自行聯系原作者