ew21w 发表于 2015-3-31 07:59:38

bash循环控制语句之for循环

一、for循环的语法
for 变量 in 列表; do
      循环语句1
      循环语句2
      循环语句3
      ……
done

二、用法
用变量去遍历列表,没访问列表中的一个元素就执行一次循环语句,直至列表中元素访问完。
为了熟悉for循环语法的使用,照搬了课程中的练习题,顺便加深对其他基础命令的印象。

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

1
2
3
4
5
6
7
8
9
#!/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三个文件各有多少行
?

1
2
3
4
5
6
7
8
#!/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秒
?

1
2
3
4
5
6
7
8
#!/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文件中各自以#开头的行的行数
?

1
2
3
4
5
6
7
8
9
#!/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文件中各自以#开头的行的行数和空白行数
?

1
2
3
4
5
6
7
8
9
#!/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`"




?

1
2
    #echo -e 与引号内的 \t 实现转义序列,可用于制表,下图中行前的空白部分即是实现效果
done






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

1
2
3
4
5
6
7
8
#!/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号
?

1
2
3
4
5
6
7
8
#!/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




或者
?

1
2
3
4
5
6
7
8
#!/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目录下各自的文件个数
?

1
2
3
4
5
6
7
8
#!/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组中,以其为额外组
?

1
2
3
4
5
6
7
8
9
#!/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文件的内容?

1
2
3
4
5
6
7
8
9
!/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?

1
2
3
4
5
6
7
8
9
10
11
12
#!/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文件中的行号
?

1
2
3
4
5
6
7
8
9
10
11
12
#!/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
?

1
2
3
4
5
6
7
8
9
10
11
#!/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和基本组的组名
?

1
2
3
4
5
6
7
8
9
10
11
#!/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

?

1
2
3
4
5
6
7
8
9
#!/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/目录下每个文件的内容类型,并统计文件的总数
?

1
2
3
4
5
6
7
8
9
10
11
#!/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以内所有整数的和
?

1
2
3
4
5
6
7
8
9
10
#!/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."




?

1





?

1
2
3
4
5
6
7
8
9
10
#!/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以内,所有偶数的和,以及所有奇数的和
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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."




?

1





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

1
2
3
4
5
6
7
8
9
10
#!/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."



页: [1]
查看完整版本: bash循环控制语句之for循环