一、for循环的语法

for 变量 in 列表; do

    循环语句1

    循环语句2

    循环语句3

    ……

done

 

二、用法

用变量去遍历列表,每访问列表中的一个元素就执行一次循环语句,直至列表中元素访问完。

为了熟悉for循环语法的使用,照搬了课程中的练习题,顺便加深对其他基础命令的印象。

 

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

#!/bin/bash
# Date: 2015-03-26
# Author: ArvinLau
# Description: 
# Version: 1.0
for FileName in /tmp/{1,2,3}.dir; do
  mkdir $FileName
  chmod 750 $FileName
done

 

练习2:显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do
    wc -l $FileName    #wc -l 查看文件内容行数
done

 

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

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for DirName in 1.dir 2.dir 3.dir;do
    touch -m -t 201003030303.03 /tmp/$DirName    #修改文件的修改时间touch -m -t
done

 

练习4:使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for FileName in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do
    LINES=`grep "^#" $FileName | wc -l`
    echo "$FileName:$LINES"
done

 

练习5:使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for FileName in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do
    echo "$FileName:"
    echo -e "\t#LINES:`grep "^#" $FileName | wc -l`"    
    echo -e "\tSpace LINES:`grep "^$" $FileName | wc -l`"
    #echo -e 与引号内的 \t 实现转义序列,可用于制表,下图中行前的空白部分即是实现效果
done

p_w_picpath_thumb[1]

 

练习6:使用for循环分别将/proc/cpuinfo、/proc/meminfo、/proc/uptime三个文件中的所有小写字符显示为大写

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for FileName in cpuinfo meminfo uptime;do
    tr 'a-z' 'A-Z' < /proc/$FileName
done

 

练习7:使用for循环显示用户user1、user2和user3各自的id号

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for User in user1 user2 user3;do
    echo "$User:`id -u $User`"
done

或者

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for I in 1 2 3;do
    echo "user$I:`id -u user$I`"
done

 

练习8:使用for循环分别统计/usr、/var、/bin、/sbin目录下各自的文件个数

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for Dir in /usr /var /bin /sbin;do
    ls $Dir | wc -l
done

 

练习9:使用for循环,分别将user1、user2和user3加入到testgrp组中,以其为额外组

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
groupadd testgrp
for I in 1 2 3;do
    usermod -a -G testgrp user$I    #-a参数意为追加,不加则为修改
done

练习10:使用for循环,将“Hello Linux.”,“Hello www.magedu.com”, “GNU is Not Unix.”三行内容添加至/tmp/test.txt文件,并显示/tmp/test.txt文件的内容

!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for Contents in "Hello Linux" "Hello www.magedu.com" "GNU is Not Unix";do
    echo $Contents >> /tmp/text.txt    #>> 追加输入重定向
done
cat /tmp/text.txt

练习11:使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions;do

    FileName=`basename $File`    #此处取基名

    cp $File /tmp/$FileName-`date +%F`    #注意date后的空格

done

 

练习12:显示当前系统上所有默认shell为/bin/bash的用户名、ID号及其在/etc/passwd文件中的行号

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
for Bash in `grep -n "/bin/bash" /etc/passwd`;do

    echo $Bash >> /tmp/bash_user_id_lines.txt    #这里将变量内容写进了临时文件中

done
cut -d: -f1,2,4 /tmp/bash_user_id_lines.txt
rm /tmp/bash_user_id_lines.txt

 

练习13:显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
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:$Uid,SHELL:$Shell"
done

 

练习14:显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
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、使用命令生成列表:见下面的例子

    for File in `ls /var`;

生成数字序列:

    {}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;  
    `seq [起始数字] [步长] 结束数字`:

练习15:使用for循环取出每个用户用户名和Shell 

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
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

 

练习16:显示/var/目录下每个文件的内容类型,并统计文件的总数

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
Count=0
for File in /var/*;do
    file $File
    Count=$[$Count+1]
    echo "Total files:$Count."
done

练习17:写一个脚本,计算100以内所有整数的和

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
Sum=0
for I in `seq 1 100`;do
    Sum=$[$Sum+$I]
done
echo "Sum:$Sum."

#或
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
Sum=0
for I in {1..100}; do
    Sum=$[$Sum+$I]
done
echo "The sum is: $Sum."

 

练习18:写一个脚本,计算100以内,所有偶数的和,以及所有奇数的和

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
EvenSum=0
OddSum=0
for I in `seq 1 2 100`;do
    OddSum=$[$OddSum+$I]
done
for I in `seq 2 2 100`;do
    EvenSum=$[$EvenSum+$I]
done
echo "EvenSum is $EvenSum,OddSum is $OddSum."


练习19:写一个脚本,计算当前系统上所有用户的ID号之和

#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description: 
# Version: 1.0
Sum=0
for I in `cut -d: -f3 /etc/passwd`;do
    Sum=$[$Sum+$I]
done
echo "ID Sum is:$Sum."