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,如需转载请自行联系原作者