一、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、使用命令生成列表:见下面的例子
`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."
转载于:https://blog.51cto.com/64314491/1626611