shell bash的for循环
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