天天看点

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