顺序执行:默认法则,逐条执行各语句
选择执行:分支,条件判断,符合条件的分支予以执行;
循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环。
程序代码:语句和表达式组成
控制语句:
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、使用命令生成