一、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
练习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."
原文地址:http://64314491.blog.51cto.com/2784219/1626611