if选择结构流程控制
1、单分支
语法结构
if 条件判断表达式;then
语句块
…..
……
fi
Ex:
if [ 9 �Clt 10 ];then
Echo “ok”
fi
2、双分支
语法格式:
if条件测试命令;then
命令1
…….
else
命令2
………
fi
练习:
ftpser.sh :如果sshd服务没有运行就把服务开启,若
[root@localhost ~]# vim ftpser.sh
#!/bin/bash
service sshd status > /dev/null
if [ $? -eq 0 ];then
echo "正在运行"
else
service sshd start
fi
[root@localhost ~]# sh ftpser.sh
正在运行
Veryser.sh 检测任意一个服务的状态,服务没有运行就把服务开启,若开启就显示服务正在运行。
[root@localhost ~]# vim veryser.sh
#!/bin/bash
#if [ $# -eq 0 ];then //注释另一种命令
if [ -z $1 ];then
echo "没有服务名"
exit
fi
service $1 status > /dev/null
if [ $? -eq 0 ];then
echo "$1正在运行"
else
service $1 start
fi
[root@localhost ~]# sh veryser.sh sshd
sshd正在运行
[root@localhost ~]# sh veryser.sh
没有服务名
3、多分支
语法格式:
if 条件测试命令1;then
命令序列1
elif 条件测试命令2;then
命令序列2
else
命令序列3
fi
实验:
Cj.sh
1-150
<=150 && >=120A
<120 && >=90B
<90 && >=60C
<60 && >=0D
没有在以上范围内,就提示“成绩的范围是0-150”
[root@localhost ~]# cat cj.sh
#!/bin/bash
read -p "输入成绩:" num
if [ $num -le 150 -a $num -ge 120 ];then
echo "A"
elif [ $num -lt 120 -a $num -ge 90 ];then
echo "B"
elif [ $num -lt 90 -a $num -ge 60 ];then
echo "C"
elif [ $num -lt 60 -a $num -ge 0 ];then
echo "D"
else
echo "成绩在0-150之间"
fi
[root@localhost ~]# sh cj.sh
输入成绩:130
A
循环结构控制
什么时候使用循环结构?
反复执行相同操作的时候使用循环结构。
1、for循环
Sh �Cx 查看执行过程{++新进程;+当前进程下}
格式:
for 变量名 in 变量值列表
do
循环体
……..
Done
练习:
在屏幕上输出10次plj字样
[root@localhost ~]# vim for1.sh
#!/bin/bash
for i in a b c d e f g h i j
do
echo "plj"
done
输出数字1-10到屏幕上
Seq造数工具//默认从1开始
Seq 10//从1-10
Seq 10 20//从10-20
Seq 10 2 20//从10-20,间隔为2
{1..10} 造数工具
输出192.168.1.0/24中的所有主机
#!/bin/bash
#for i in `seq 254`
#do
# echo "192.168.1.$i"
#done
统计192.168.1.0/24内不在线的主机
j=0
for i in `seq 254`
do
(ping -c 3 192.168.1.$i > /dev/null
if [ $? -ne 0 ];then
let j++
#j=`expr $j + 1`
fi)&
done
echo $j
输出50内的偶数
#!/bin/bash
for i in `seq 50`
do
if [ `expr $i % 2` -eq 0 ];then
echo $i
fi
done
2、while循环
Sleep 1//间隔的时间(s)
只要条件成立就执行循环体
格式:
While [ 表达式 ]
do
循环体
…..
done
练习:
输出数字1-10
#!/bin/bash
i=1
while [ $i �Cle 10]
do
echo $i
let i++
done
降序输出数字1-10
#!/bin/bash
i=10
while [ $i -gt 0 ]
do
echo $i
let i--
done
批量添加10系统账号
账号命令规则 user01 ……..user10
账号密码与用户名相同
用户第一次登陆系统时必须要重置自己的密码
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ $i -le 9 ]
then
useradd user0$i
echo "user0$i" | passwd --stdin user0$i
chage -d 0 user0$i
else
useradd user$i
echo "user$i" | passwd --stdin user$i
chage -d 0 user$i
fi
let i++
done
user.sh 功能:交互式添加系统账号
添加用户时可以设置添加用户个数
用户名前缀
用户的有效期
用户密码
#!/bin/bash
read -p "输入用户个数:" num
read -p "用户名前缀:" name
read -p "有效期:" date
read -p "密码:" mima
for ((i=1;i<=$num;i++))
do
useradd $name$i
echo "$mima" | passwd --stdin $name$num
chage -E $date $name$num
done
3、C语言风格循环
格式:
for ((初值;条件;步长))
do
循环体
done
实验:
输出1-10升降输出
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
echo ------------------------
for ((i=10;i>=1;i--))
do
echo $i
done
4、until循环
条件不成立时,才执行循环体,条件成立循环体结束
格式:
until 条件表达式
do
循环体
done
降序输出1-10
#!/bin/bash
i=10
until [ $i -le 0 ]
do
echo $i
let i--
done
5、恒真恒假
while true//恒为真
while ://恒为真
until false//恒为假
: 放在条件中恒为真,放在循环体中什么都不做
总练习:
gateway.sh
自动切换当前主机的网关
网关1的地址是 192.168.1.254/24
网关2的地址是 192.168.1.253/24
将主机当前的网关指向192.168.1.254,当网关地址254不可用时,自动把网关切换到253;当网关254 可用时 再把网关切换回254.
Route add/del default gw $i
254 ifdown eth0
Watch �Cn 1 route �Cn
Case分支结构
选择结构
格式:
Case 变量值 in
模式1)
命令序列1;;
模式2)
命令序列2;;
………
*)
默认命令序列(变量值与上边给出的所有模式都不匹配时执行的操作)
esac
练习:
根据用户选择的不同动物名称,输出不同的信息
Dog 你是人类忠实的朋友
Tuzi 爱吃萝卜爱吃菜
Laohu 土豪
Daxiang 大象都在户外
#!/bin/bash
read -p "你喜欢的动物 dog | tuzi | laohu | daxiang:" dw
case $dw in
"dog")//“”可有可无
echo "你是人类忠实的朋友";;
"tuzi")
echo "爱吃萝卜爱吃菜";;
"laohu")
echo "土豪";;
"daxiang")
echo "大象都在户外";;
*)
echo "必选"
esac
流程控制语句
-break
跳出当前所在循环体,执行循环后的语句。
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ $i -eq 7 ];then
break
fi
echo $i
let i++
done
-continue
结束本次循环,开始下一次循环。
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ $i -eq 7 ];then
let i++
continue
fi
echo $i
let i++
done
-exit
退出脚本,默认返回值0
#!/bin/bash
i=1
while [ $i -le 10 ]
do
if [ $i -eq 7 ];then
exit 3//定义它的返回值3
fi
echo $i
let i++
done
[root@localhost ~]# echo $?
3
-return
用在函数里,指定返回值。
-shift
用于迁移位置变量,顺序向左移动,把没有值得位置变量删除。
!/bin/bash
while [ $# -ne 0 ]
do
echo $1
shift
done
#!/bin/bash
sum=0
if [ $# -eq 0 ];then
echo "输入"
exit
else
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
done
fi
echo $sum
[root@localhost ~]# sh shift.sh 1 2 3 4
10