shell的流程控制

本文详细介绍了Shell脚本中的for语句、条件语句(while、until、if...then...elif...else...fi)以及case结构的使用,包括基本格式、示例和脚本练习。此外,还涉及了expect脚本的编写,用于自动化交互过程。通过这些内容,读者可以掌握如何在Shell脚本中实现循环和条件控制,以及自动化任务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.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		//脚本退出 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值