面向过程的编译语句,语言控制结构:
顺序执行:默认法则,逐条执行各语句
选择执行:条件判断,只有部分是符合条件,只执行符合条件的部分
布尔测试:真,假(0:真;1-255:假);
循环执行:将同一段代码反复执行n次;循环必须要有退出条件,否则就成为了死循环。

控制语句:
      bash循环控制语句:
               for
               while
               until
bash的for循环:
        事先提供一个元素列表,而后,使用变量去遍历此元素列表;每访问一个元素,就会执行一次循环体;直到元素遍历完毕
用法格式:
 for VAR_NAME in 元素(列表)1 元素(列表)2…
         do
语句1
语句2
            …
         done
注:for和do可以写在同一行中但必须用分号隔开

对于这些知识的运用只能在练习中不断练习才能达到牢固掌握。

练习1:写一个脚本
       使用for循环创建目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,并将它们的权限均修改为750;

#!/bin/bash

for DirName in/tmp/1.dir /tmp/2.dir /tmp/3.dir; do
  mkdir $DirName
  chmod 750 $DirName
done

ls –l /tmp 验证一下

练习2:写一个脚本
使用for循环修改目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改时间为2010年3月3号3点3分3秒;
#!/bin/bash

for Dir in/tmp/1.dir /tmp/2.dir /tmp/3.dir
do
touch -mt201003030303.03 $Dir
done

stat/tmp/1.dir  查看结果
或:#!/bin/bash
for Dir in/tmp/1.dir /tmp/2.dir /tmp/3.dir
do
stat $Dir
touch -mt201003030303.03 $Dir
stat $Dir
done

练习3:写一个脚本
使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数;
         #!/bin/bash
for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab
do
grep '^#.*' $ File| wc -l
done

人性化写法:
#!/bin/bash
for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab ; do
     LINES=`grep '^#' $File | wc -l`
     echo "$File:$LINES"
done

#!/bin/bash
for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
     LINES=$(grep '^#' $File | wc -l)
     echo "$File:$LINES"
done

练习4:写一个脚本
使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数;
#!/bin/bash
for File in/etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do
  echo "$File:"
  echo "lines:`grep "^#" $File |wc -l`"
  echo "space lines:`grep "^$"$File | wc -l`"
done

练习5:写一个脚本
使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15;
#!/bin/bash
for File in/etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do
  cp $File /tmp/$File-`date +%F`
done
练习6:写一个脚本
      显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell;
#! /bin/bash
for Line in 1 3 6 12;do
UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
         Uid=`head-$Line /etc/passwd | tail -1 | cut -d: -f3`
         Shell=`head-$Line /etc/passwd | tail -1 | cut -d: -f7`

         echo"User: $UserName, UID is $Uid, Shell: $shell"
done


练习7:写一个脚本
      显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名;
#!/bin/bash

for Line in 1 3 6 12; do
 UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
 Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3` 
 GroupName=`id -gn $UserName`
 echo "$UserName, $Uid, $GroupName"
done

列表的生成方式:
1:逐个给出,如:/etc/inittab/etc/fstab;
2:使用通配符来实现文件通配,例:for File in /var/*;
3:使用命令生成列表,详见下例(生成的一般为相对路径)
 #!/bin/bash
for File in `ls /var`;do
                   file /var/$file
done
4:生成数字序列;
 {}:{起始数字..结束数字},例如{1..100}表示从1到100之间的所有正整数
 `seq [起始数字] [步长] [结束数字]`,例:seq 1 2100 表示从1到100之间以2个单位输出

练习8: 写一个脚本
使用for循环取出每个用户用户名和Shell;

#!/bin/bash
LINES=`wc -l/etc/passwd | cut -d' ' -f1`

for I in `seq 1$LINES`; do
  head -$I /etc/passwd | tail -1 | cut -d:-f1,7
done

https://blog.51cto.com/pangge/1253992