流程控制
过程式编程语言:
顺序执行
选择执行
循环执行
1.条件选择if语句
选择执行:
注意:if语句可嵌套
单分支
if 判断条件;then
条件为真的分支代码
fi
单分支相当于cmd1 && cmd2
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
双分支相当于 cmd1 && cmd2 || cmd3 但是cmd2必须成功
多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
If示例
1.根据命令的退出状态来执行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo ‘Station1 is UP’
elif grep “station1” ~/maintenance.txt &> /dev/null; then
echo ‘Station1 is undergoing maintenance‘
else
echo ‘Station1 is unexpectedly DOWN!’
exit 1
fi
2.age.shell输入一个年龄数值,显示相应的信息(18岁以下 好好学习天天向上,60岁以下努力工作,60岁以后享受生活,其他输入你不是地球人)
3.写一个脚本areyourich.sh 完成如下逻辑
4.条件判断:case语句
case示例:
1.写个脚本,numcase.sh 输入一个数字,属于1、2、3就显示1,2,3;属于4,5,6就显示4,5,6;属于7,8,9就显示7,8,9;否则就显示“other digit”
read -p “Please input a digit: ” num
case $num in
1|2|3)
echo 1,2,3
;;
4|5|6)
echo 4,5,6
;;
7|8|9)
echo 7,8,9
;;
*)
echo “other digit”
;;
esac
2.写个脚本,menucase.sh。列出菜单点菜
001.rice–2 RMB
002.noodles–15 RMB
003.dumpligs—18 RMB
004.beer— 6RMB
练习
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
正整数:[[ “
num"= [1−9][0−9]+
n
u
m
"=
[
1
−
9
]
[
0
−
9
]
+
]]
5.循环–循环条件已知的
循环执行
将某代码段重复运行多次
重复运行多少次
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until
6.for循环语法一:
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
for循环示例
1.写个脚本sum100-for.sh,,先列出1-100的数字,然后求1-100累加和
for num in {1..100}; do echo “num=
num”;donesum=0;fornumin1..100;dosum=
n
u
m
”
;
d
o
n
e
s
u
m
=
0
;
f
o
r
n
u
m
i
n
1..100
;
d
o
s
u
m
=
[sum+num]; done;echo sum=$sum
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) (seq [start [step]] end)
seq 1 2 10 #1-10,步进值=2
(3) 返回列表的命令
(seq [start [step]] end) seq 1 2 10 #1-10,步进值=2 (3) 返回列表的命令
(COMMAND)
(4) 使用glob(通配符),如:*.sh
(5) 变量引用;
@
@
*
列表生成脚本示例:
1.写脚本creatuser100-magedu.sh,创建user1…..user100 ,初始密码为magedu,并且首次登录必须修改密码
for i in seg 1 100
;do
useradd useri &>/dev/null
echo magedu | passwd –stdin user
i &>/dev/null echo magedu | passwd –stdin user
i &>/dev/null
passwd -e user
i
i
>/dev/null
done
2.写脚本scanip.sh,扫描当前网段哪些IP是up的,并记录到文件./ipist.log,顺序执行太慢,所以要用并发执行{}&
./iplist.log #每次追加IP,需要先清空一次免得重复
read -p “Please input network ID (eg:192.168.0.0): ” net
net=echo $net | cut -d. -f1-3
#用户自定义
for i inseq 1 254
;do
{if ping -c1 -W1 net. n e t . i &> /dev/null; then
echo “The host net. n e t . i is up”
echo net. n e t . i > ./iplist.log
else echo “The host net. n e t . i is down”
fi} &
done
wait #wait命令,当脚本执行完之后自动回车,显示提示符免得执行完了却不出现提示符
3.写个脚本netid.sh,让用户输入IP地址和子网掩码,计算出网络ID。
read -p “Please input a ip address: ” ip
read -p “Please input a netmask: ” netmask
for i in {1..4} ; do
net=echo $ip | cut -d. -f$i
mask=echo $netmask | cut -d. -f$i
if [
i−eq1];thennetid=
i
−
e
q
1
]
;
t
h
e
n
n
e
t
i
d
=
[net&mask]
else
netid=
netid.
n
e
t
i
d
.
[net&mask]
fi
done
echo Network ID is $netid
练习:用for实现
1、判断/var/目录下所有文件的类型
2、添加10个用户user1-user10,密码为8位随机字符
3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
5、计算100以内所有能被3整除的整数之和
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
7、打印九九乘法表 for99sheet.sh
for i in {1..9};do
for j in seq $i
;do
echo -e “
j∗
j
∗
i=
((
(
(
j*$i))\t\c”
done
echo
done
8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
随机数:tr -dc ‘0-9a-zA-Z’ < /dev/urandom | head -c8
或者 openssl rand -base64 8
for i in {1..10};do touch $itr -dc '0-9a-zA-Z' < /dev/urandom | head -c8
.html;done
9、打印等腰三角形
10.做一个国际象棋棋盘chess.sh
思路:行数和列数 i和j,取模(余数)相同的格子颜色是一样的
for i in {1..8} ; do
temp1=
[
[
i % 2 ]
for j in {1..8}; do
temp2=
[
[
j % 2 ]
if [
temp1−eq
t
e
m
p
1
−
e
q
temp2 ];then
echo -e -n “\033[47m \033[0m”
else
echo -e -n “\033[41m \033[0m”
fi
done
echo
done