if选择结构流程控制

1、单分支

语法结构

if 条件判断表达式;then

语句块

…..

……

fi

Ex:

if [ 9 –lt 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 –x 查看执行过程{++新进程;+当前进程下}

格式:

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 –le 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 –n 1 route –n

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