顺序执行:默认法则,逐条执行各语句

选择执行:分支,条件判断,符合条件的分支予以执行;

循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环。


程序代码:语句和表达式组成


控制语句:


bash循环控制语句:for  while  until


for循环:

for var_Name in 列表; do

语句1

语句2

...

done


循环添加指定用户

for userName in gentoo mandriva debian; do

useradd $userName

done


语法错误检测:

# bash -n 脚本文件


写一个脚本:添加10个用户,user101-user110


列表的生成方法:

生成数字序列:{start..end}、seq [start] [step] end


#!/bin/bash

for userName in `seq 101 110`; do

useradd user$userName

echo "Add user$userName successfully."

done


练习:写一个脚本,用file命令显示/var/log目录下每个文件的内容类型;

提示:列表生成的方法为/var/log/*


#!/bin/bash

#

dirName=/var/log

for fileName in $dirName/*; do

file $fileName

done 


bash -n /path/to/script



循环:退出条件, 元素列表遍历结束


for varName in LIST

do

statement1

...

done



练习:写一个脚本,

1、创建/tmp/scripttest目录,用变量保存目录名;

2、在目录里创建测试文件tfile1-tfile20;

3、创建用户testuser1和testuser2; 

4、将tfile1-tfile10的属主和属组改为testuser1;

5、将tfile11-tfile20的属主和属组改为testuser2;


#!/bin/bash

dirName=/tmp/scripttest


mkdir $dirName

for fileNo in {1..20}; do

touch $dirName/tfile$fileNo

echo "Create $dirName/tfile$fileNo finished"

done 


useradd testuser1

useradd testuser2


for fileNo in {1..10}; do

chown testuser1:testuser1 $dirName/tfile$fileNo

done


for fileNo in {11..20}; do

chown testuser2:testuser2 $dirName/tfile$fileNo

done



#!/bin/bash

dirName=/tmp/scripttest


useradd testuser1

useradd testuser2


mkdir $dirName

for fileNo in {1..10};do

touch $dirName/tfile$fileNo

chown testuser1:testuser1 $dirName/tfile$fileNo

done



练习:写一个脚本,用for循环实现

显示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行;


#!/bin/bash

for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do

wc -l $fileName

done


#!/bin/bash

for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do

lineCount=`wc -l $fileName | cut -d' ' -f1`

echo "$fileName: $lineCount lines."

done


#!/bin/bash

for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do

echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines."

done


练习:写一个脚本

将上一题中三个文件的复制到/tmp目录中;

用for循环实现,分别将每个文件的最近一次的修改时间改为2011年9月15号13点27分;

#!/bin/bash

for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do

cp $fileName /tmp

baseName=`basename $fileName`

touch -m -t 201109151327 /tmp/$baseName

done



练习:写一个脚本

显示/etc/passwd中第3、7和11个用户的用户名和ID号;

#!/bin/bash

#

for lineNo in 3 7 11; do

userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3`

echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`"

done


练习:计算100以内所有正整数之和;

#!/bin/bash

#

declare -i sum=0

for i in {1..100}; do

  let sum=$sum+$i

done


echo "The sum is: $sum."


练习:求200以内所有3的整数倍的正整数的和;

#!/bin/bash

declare -i sum=0

for i in {1..200}; do

if [ $[$i%3] -eq 0 ]; then

let sum+=$i

fi

done


echo "The sum is: $sum."


知识点:bash的单步执行:

bash -x /path/to/script




练习:分别计算100以内所有偶数之和和奇数之和;

#!/bin/bash

declare -i oddSum=0,evenSum=0


for i in `seq 1 2 100`; do

  oddSum=$[$oddSum+$i]

done


for j in `seq 2 2 100`; do

evenSum=$[$evenSum+$j]

done


echo "The Even Sum is: $evenSum, the odd sum is: $oddSum"


练习:计算当前系统所有用户的ID之和;


#!/bin/bash

declare -i uidSum=0

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

uidSum=$[$uidSum+$i]

done


echo "The UIDSum is: $uidSum."


练习:计算/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/issue三个文件的字符数之和;

#!/bin/bash

#

declare -i bytesCount=0

for file in /etc/rc.d/rc.sysinit /etc/init.d/functions /etc/issue; do

let bytesCount=$bytesCount+`wc -c $file | cut -d' ' -f1`

done


echo $bytesCount


练习:新建用户tmpuser1-tmpuser10,并计算他们的id之和;

#!/bin/bash

#

declare -i uidSum=0

for i in {1..10}; do

 useradd tmpuser$i 

 let uidSum=$uidSum+`id -u tmpuser$i`

done


练习:写一脚本,实现如下功能:

1、让用户通过键盘输入一个用户名,如果用户不存在就退出;

2、如果其UID等于其GID,就说它是个"good guy"

3、否则,就说它是个“bad guy”;


#!/bin/bash

# exit 6 -- 

read -t 10 -p "Enter a username: " userName

if ! id $userName &> /dev/null; then

echo "$userName not exist."

exit 6

fi


if [ `id -u $userName` -eq `id -g $userName` ]; then

echo "Good guy."

else

echo "Bad guy."

fi


扩展:判断当前系统上的所有用户是Good guy还是Bad guy.


for userName in `cut -d: -f1 /etc/passwd`; do

done



练习:写一个脚本,实现如下功能:

1、添加10个用户stu1-stu10;但要先判断用户是否存在;

2、如果存在,就用红色显示其已经存在

3、否则,就添加此用户;并绿色显示;

4、最后显示一共添加了几个用户;


#!/bin/bash

#

declare -i userCount=0

for i in {1..10}; do

if id stu$i &> /dev/null; then

echo -e "\033[31mstu$i\033[0m exists."

else

useradd stu$i && echo -e "add \033[32mstu$i\033[0m finished."

let userCount++

fi

done


echo "Add $userCount users."


for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环;

总结:生成列表的方式

1、直接给出列表;

2、使用文件名通配的机制生成列表

3、可以使用{}或seq命令生成数字序列  $lineCount  `seq 1 $lineCount`  {1..$lineCount}

4、使用命令生成