shell的流程控制
一.for语句
1.作用
为循环执行动作
2.for语句结构
for 定义变量
do 使用变量,执行动作
done 结束标志
3.for语句的基本格式
(1)格式1
#!/bin/bash
for WESTOS in $(seq 1 2 10)
do
echo $WESTOS
done
11 for NUM in `seq 1 10`
12 do
13 echo $NUM
14 done
(2)格式2
for WESTOS in westos linux lee
do
echo $WESTOS
done
11 for NAME in westos lee root hk
12 do
13 id $NAME &> /dev/null && {
14 echo $NAME is exist
15 } || {
16 echo $NAME is not exist
17 }
18 sleep 1
19 done
(3)格式3
for WESTOS in {10..1}
do
echo $WESTOS
done
(4)格式4
for ((WESTOS=0;WESTOS<10;WESTOS++))
do
echo $WESTOS
done
4.脚本练习
(1)ip
check_host.sh
用此脚本检测10台与您当前主机直连主机是否网络通常
如果网络通常请显示主机的ip列表
11 for NUM in {1..10}
12 do
13 ping -c1 -w1 172.25.254.$NUM &> /dev/null && {
14 echo 172.25.254.$NUM is up
15 } || {
16 echo 172.25.254.$NUM is down
17 }
18 done
(2)用户列表的文件检测
11 [ -z "$1" ] && {
12 echo "Error: Please input userfilelist following $0"
13 exit
14 }
15 [ -e "$1" ] && {
16 echo "Error: $1 is not exist"
17 exit
18 }
19
20 for NAME in `cat $1`
21 do
22 id $NAME &> /dev/null && {
23 echo $NAME is exist
24
25 } || {
26 useradd $NAME
27 echo $NAME is created
28
29 }
30 done
二.条件语句
1.while…do语句
(1)作用
条件为真执行动作
(2)语句结构
while ture <!--条件为真-->
do <!--条件成立所作循环动作-->
done <!--结束-->
(3)示例
while true
do
read -p "Please input word: " WORD
echo $WORD
done
2.until…do 语句
(1)作用
条件为假执行动作
(2)语句结构
until false <!--条件为假-->
do <!--条件不成立所作循环动作-->
done <!--结束-->
(3)示例
until false
do
read -p "Please input word: " WORD
echo $WORD
done
3.if…then…elif…then…else…fi 语句
(1)作用
多次判定条件执行动作
(2)代码结构
if <!--首次判断定-->
then <!--条件成立执行动作-->
elif <!--当首次判定不成立时再次判定-->
then <!--条件成立执行动作-->
... <!--elif可以书写多次-->
else <!--所有条件不成立执行动作-->
fi <!--结束-->
(3)示例
if[ "$1" -eq "5"]
then
echo luck number
elif [ "$1" -eq "4" ]
then
echo bad number
else
echo common number
fi
4.脚本练习
(1)要求
check_file.sh
please input filename: file
file is not exist
file is file
file is direcory
此脚本会一直询问直到用户输入exit为止
(2)脚本
while true
do
read -p "Please input filename: " FILENAME
if [ "$FILENAME" = "exit" -o "$FILENAME"= "EXIT" ]
then
echo bye
exit
elif [! -e "$FILENAME"]
then
echo "$FILENAME is not exist"
elif [ -L "$FILENAME"]
then
echo "$FILENAME is link file"
elif [! -f "$FILENAME"]
then
echo "$FILENAME is common file"
fi
done
三.case
1.结构
case $1 in
word1|WORD1)
action1
;;
word2|WORD2)
action2
;;
*)
action3
esac
2.示例
case $1 in
linux)
echo westos
;;
westos)
echo redhat
;;
*)
echo error
esac
3.user_ctrl的多种控制实现
(1)自己写的
10 #!/bin/bash
11
12 Check_action(){
13 read -p "Please input action:" ACTION
14 case $ACTION in
15 exit|EXIT)
16 echo "BYEBYE"
17 exit
18 ;;
19 add|ADD)
20 Action_add
21 ;;
22 del|DEL)
23 Action_del
24 ;;
25 *)
26 echo WRONG ACTION!
27 Check_action
28 ;;
29 esac
30 }
31 Action_add()
32 {
33 read -p "Please input username: " USERNAME
34 [ "USERNAME" = "exit" -o "USERNAME" = "EXIT" ] && {
35 Check_action
36 }``
37 id $USERNAME &> /dev/null && {
38 echo $USERNAME is exist
39 Action_add
40 } || {
41 useradd $USERNAME
42 read -p "Please input $USERNAME's password:" -s PASS
43 echo $PASS | passwd --stdin $USERNAME &> /dev/null && echo $USERNAME is created
44 Action_add
45 }
46 }
47
48 Action_del()
49 {
50 read -p "Please input username: " USERNAME
51 [ "USERNAME" = "exit" -o "USERNAME" = "EXIT" ] && {
52 Check_action
53 }
54 id $USERNAME &> /dev/null && {
55 userdel $USERNAME
56 echo $USERNAME is deleted!
57 Action_del
58 } || {
59 echo $USERNAME is not exist!
60 Action_del
61 }
62 }
63 Check_action
(2)老师写的
11 USER_CTRL()
12 {
13 read -p "Please input username:" USER
14 if [ "$USER" = "exit" ]
15 then
16 break
17 else
18 id $USER &> /dev/null && {
19 case $1 in
20 add)
21 echo "$USER is exist !!"
22 USER_CTRL add
23 ;;
24 del)
25 userdel -r $USER
26 esac
27 } || {
28 case $1 in
29 add)
30 read -p "Please input password: " PASS
31 useradd $USER
32 echo PASS | passwd --stdin $USER
33 ;;
34 del)
35 echo "$USER is not exist"
36 USER_CTRL del
37 esac
38
39 }
40 fi
41 }
42 while true
43 do
44 read -p "Please input action:" ACTION
45 case $ACTION in
46 exit)
47 exit
48 ;;
49 add)
50 USER_CTRL add
51 ;;
52 del)
53 USER_CTRL del
54 ;;
55 *)
56 echo wrong action
57 esac
58 done
59
四.expect
1.问题脚本
cd /mnt
vim ask.sh
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK
2.应答脚本
dnf install expect -y
vim answer.exp
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh
expect {
"name" { send "$NAME\r";exp_continue }
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof
3.测试
[root@westosD100 /]# expect answer.exp hkk 18 linux happy
spawn /mnt/ask.sh
what's your name:hkk
How old are you: 18
Which objective: linux
Are you happy:? happy
hkk is 18's old study linux feel happy
4.脚本练习
(1)要求
host_list.sh
检测172.25.254.1-172.25.254.10网络是否开启
如果网络正常请生成解析列表hosts_list
格式如下
ip 主机名称
例如:172.25.254.1为开启状态主机名为westos_student1.westos.org
hosts_list中
172.25.254.1 westos_student1.westos.org
(2)脚本
vim host_list.sh
10 #!/bin/bash
11 Auto_Ssh()
12 {
13 /usr/bin/expect <<EOF
14 spawn ssh -l root $1 hostname
15 expect {
16 "yes/no" {send "yes\r";exp_continue}
17 "password:" {send "westos\r"}
18 }
19 expect eof
20 EOF
21 }
22 [ -z "$1" ] && {
23 echo "Please input check ipaddress !!"
24 exit
25 }
26 ping -c1 -w1 $1 &> /dev/null && {
27 Auto_Ssh $1 | tail -n 1
28 } || {
29 echo $1 is down
30 }
五.break,continue,exit
contiue //终止当此次前循环提前进入下个循环
break //终止当前所在语句所有动作进行语句外的其他动作
exit //脚本退出