bash的for循环:

事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕;


用法格式:

for VAR_NAME in 元素1 元素2 ...; do

语句1;

语句2;

...

done



#!/bin/bash

#


for UserName in user1 user2 user3; do

useradd $UserName

echo $UserName | passwd --stdin $UserName

done

练习1:写一个脚本,显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行;

for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do

wc -l $FileName

done

练习2:写一个脚本

使用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

练习3:写一个脚本

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

touch命令:

touch FILE

-a FILE

-m FILE

-t STAMP, [CC]YYMMDDhhmm.ss

touch -m -t 201003030303.03 /tmp/1.dir


#!/bin/bash


for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

touch -m -t 201003030303.03 $Dir

done


for Dir in 1.dir 2.dir 3.dir; do

touch -m -t 201003030303.03 /tmp/$Dir

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

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

echo "$File: `grep "^#" $File | wc -l`"

done

练习5:写一个脚本

使用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 -e "\t#lines: `grep "^#" $File | wc -l`"

echo -e "\tspace lines: `grep "^$" $File | wc -l`"

done

练习6:写一个脚本

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

#!/bin/bash


for File in /proc/cpuinfo /proc/meminfo /proc/uptime; do

tr 'a-z' 'A-Z' < $File

done

练习7:写一个脚本

使用for循环显示用户user1、user2和user3各自的id号;

#!/bin/bash


for I in 1 2 3; do

id -u user$I

done


#!/bin/bash


for I in 1 2 3; do

echo "user$I: `id -u user$I`"

done

练习8:写一个脚本

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

#!/bin/bash


for Dir in /usr /var /bin /sbin;do

ls $Dir | wc -l

done

练习9:写一个脚本

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

#!/bin/bash

groupadd testgrp


for User in user1 user2 user3; do

usermod -a -G testgrp $User

done

练习10:写一个脚本

使用for循环,将“Hello Linux.”,“Hello www.magedu.com”, “GNU is Not Unix.”三行内容添加至/tmp/test.txt文件;

添加完成后,显示/tmp/test.txt文件的内容;

#!/bin/bash

for Line in "Hello Linux" "Hello www.magedu.com" "GNU is Not Unix"; do

echo $Line >> /tmp/test.txt

done


cat /tmp/test.txt

练习11:写一个脚本

使用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


/etc/fstab /etc/inittab


#!/bin/bash

for File in fstab inittab; do

cp /etc/$File /tmp/$File-`date +%F`

done

练习12:写一个脚本

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

练习13:写一个脚本

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


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

练习14:写一个脚本

显示/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


for 变量 in 列表; do

语句1

语句2

...

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 [起始数字] [步长] 结束数字`:

练习:写一个脚本

使用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



如何在shell脚本中进行算术运算:

shell不支持浮点数;计算结果中的浮点数会被圆整为整数;1.23, 1; 1.99=1;


+, -, *, /,


算术运算的实现方式:假设A=5,B=9

$[expression]:例如$[$A+$B]

$((expression)): 例如$(($A+$B))

let expression: 例如 let E=$A+$B

expr expression: F=`expr $A + $B`

练习:写一个脚本,

随意声明两个变量,并给出整数值,而后计算它们的加、减、乘、除;

练习:写一个脚本

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


#!/bin/bash

#

Count=0


for File in /var/*; do

file $File

Count=$[$Count+1]

done


echo "Total files: $Count."

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

#!/bin/bash

#

Sum=0


for I in {1..100}; do

Sum=$[$Sum+$I]

done


echo "The sum is: $Sum."

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

#!/bin/bash


EvenSum=0

OddSum=0


for I in `seq 12 100`;do

OddSum=$[$OddSum+$I]

done


for I in `seq 22 100`;do

EvenSum=$[$EvenSum+$I]

done


echo "Even Sum:$EvenSum; Odd Sum: $OddSum."

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

#!/bin/bash

IDSum=0


for I in `cut -d: -f3 /etc/passwd`; do

IDSum=$[$IDSum+$I]

done


echo "ID sum is: $IDSum."


blog comments powered by Disqus

Published

31 October 2013

Tags