shell的执行流控制(for、while、if 、case、expect、break)

一、for语句

  • 作用:为循环执行动作
  • for语句结构
for  定义变量
do   使用变量,执行动作
done 结束标志

1、for语句的基本格式

格式一:全部列出,依次循环

for HOST in 1 2 3 4 5 6 7 8 9 10
do
  echo $HOST
done

格式二:连续数字,依次循环

for HOST in {1..10}
do
  echo $HOST
done

格式三:连续数字,用seq方式指定间隔,依次循环
seq 1 2 10 = 1,3,5,7,9

for HOST in $(seq 1 2 10)
do
  echo $HOST
done

格式四:for循环语句

for ((HOST=0;HOST<10;HOST++))
do
  echo $HOST
done

2、示例

编写check_host.sh,用此脚本检测 10 台主机与当前主机是否网络通畅,如果网络通畅请显示主机的 ip 列表

vim check_host.sh

for HOST in $(seq 1 10)
do
  ping -c1 -w1 172.25.36.$HOST &> /dev/null && {
    echo 172.25.36.$HOST is up
  }
done

二、条件语句

1、while…do语句

作用:条件为真时执行动作
语句结构:

while true
do
done

2、until…do语句

作用:条件为假时执行动作
语句结构:

until false
do
done

3、if …then语句

作用:多次判定条件执行动作
语句结构:

if
then
elif
then
...
else
fi

4、示例

编写check_file.sh,需要提示用户输入文件名,用来判断文件类型,文件不存在时报错,直到输入exit时退出脚本,执行脚本的用户必须是root用户

vim check_file.sh

while [ "$USER" = "root" ]
do
  read -p "Please input filename: " FILE
  if [ $FILE = "exit" ]
  then
    echo "bye !!!"
    exit
  elif [ ! -e "$FILE" ]
  then
    echo "Error: $FILE is not exist !!!"
  elif [ -f "$FILE" ]
  then
    echo "$FILE is a file"
  elif [ -d "$FILE" ]
  then
    echo "$FILE is a directory"
  fi
done
echo "Error: please use root user !!!"

在这里插入图片描述

三、case语句

作用:符合哪个条件时执行相应的动作,对于同级别的条件,执行效率更高,点名机制;而if语句判定时为从上到下判定,更适合不同级别的条件。

语句结构:

case $1 in
	word1|WORD1)
	action1
	;;
	word2|WORD2)
	action2
	;;
	*)
	action3
esac

示例: 编写grade.sh判定成绩的等级

vim grade.sh

until false
do
  read -p "Please input your score: " ABC
  case $ABC in
    [8-9][0-9] | 100)
    echo "Your score is A"
    ;;
    [6-7][0-9])
    echo "Your score is B"
    ;;
    [1-5][0-9] | [0-9])
    echo "Your score is C"
    ;;
    exit)
    echo "Thanks for your inquiry"
    exit
    ;;
    *)
    echo "Please input your real score !!"
  esac
done

在这里插入图片描述

四、expect应答语句

作用:针对一些需要根据问题输入答案的命令,如ssh远程连接时,需要输入密码,第一次连接还需要输入yes等,问题不同,答案也不同。

  • 为模拟此类问题,设定一个问题脚本,并给予执行权限

问题脚本:

vim ask.sh

#!/bin/bash
read -p "What is your name? " NAME
read -p "How old are you? " AGE
read -p "Which subject do you study? " SUBJECT
read -p "How do you feel for study it? " FEEL
echo $NAME is $AGE\'s old, he study $SUBJECT and he feel $FEEL

执行问题脚本时,需要一个一个输入答案,也可以选择多行输入EOF,提前把答案写入,但如果问题发生变化,就会回答错误,此时就需要使用expect来根据问题进行回答。
在这里插入图片描述应答脚本:
注意:系统默认没有expect,需要安装,expect有自己的独立环境,创建应答脚本answer.exp时要监控问题脚本

1、固定答案

\r:换行,exp_continue:没有遇到问题的关键字时,继续按expect执行

yum install expect -y
vim answer.exp

#!/usr/bin/expect  ##指定expect环境
spawn /mnt/ask.sh  ##监控问题脚本
expect {
  "name" { send "skk\r";exp_continue }
  "old" { send "21\r";exp_continue }
  "subject" { send "linux\r";exp_continue }
  "feel" { send "fine\r" }
}
expect eof  ##退出expect环境

在这里插入图片描述

2、手动赋予答案

set:定义内置变量和变量,timeout 3:expect超时时间为3s,默认为10s
lindex $argv 0:脚本后跟的第一个参数,lindex $argv 1:脚本后跟的第二个参数

vim answer.exp

#!/usr/bin/expect
spawn /mnt/ask.sh
set timeout 3  ##设定超时时间为3s
set NAME [ lindex $argv 0 ]  ##将脚本后的第一个参数赋予NAME
set AGE [ lindex $argv 1 ]
set SUBJECT [ lindex $argv 2 ]  ##将脚本后的第二个参数赋予SUBJECT
set FEEL [ lindex $argv 3 ]
expect {
  "name" { send "$NAME\r";exp_continue }
  "old" { send "$AGE\r";exp_continue }
  "subject" { send "$SUBJECT\r";exp_continue }
  "feel" { send "$FEEL\r" }
}
expect eof

在这里插入图片描述

3、将expect与bash环境结合

vim answer.sh

#!/bin/bash
/usr/bin/expect <<EOF
spawn /mnt/ask.sh
expect {
  "name" { send "$1\r";exp_continue }
  "old" { send "$2\r";exp_continue }
  "subject" { send "$3\r";exp_continue }
  "feel" { send "$4\r" }
}
expect eof 
EOF

在这里插入图片描述

4、示例

编写host_list.sh,检测172.25.36.1~172.25.36.10 网络是否开启,如果网络正常请生成解析列表 hosts_list,由ip + hostname组成,每台主机密码均为skklinux

vim host_list.sh

SSH_hostname()
{
/usr/bin/expect <<EOF  ##使用expect远程连接获取hostname
spawn ssh -l root $1 hostname
expect {
  "yes/no" { send "yes\r";exp_continue }
  "password" { send "westos\r" }
}
expect eof
EOF
}
for IP in 172.25.36.{1..10}
do
  ping -c1 -w1 $IP &> /dev/null && {
    echo -e "$IP\t`SSH_hostname $IP | sed -n '$p'`" >> /mnt/hosts_list
  }
done

在这里插入图片描述

五、终止语句

continue终止当前循环提前进入下个循环
break终⽌当前所在语句所有动作进⾏语句外的其他动作
exit退出脚本

示例: 区别三者

1、完整输出

vim skk.sh

#!/bin/bash
for NUM in {1..5}
do
  if [ "$NUM" = "3" ]
  then
    echo "Luck number !!"
  fi
  echo "$NUM"
done
echo "hello linux"

在这里插入图片描述2、添加continue,跳过输出3

vim skk.sh

#!/bin/bash
for NUM in {1..5}
do
  if [ "$NUM" = "3" ]
  then
    echo "Luck number !!"
    continue
  fi
  echo "$NUM"
done
echo "hello linux"

在这里插入图片描述3、添加break,跳过剩下的循环

vim skk.sh

#!/bin/bash
for NUM in {1..5}
do
  if [ "$NUM" = "3" ]
  then
    echo "Luck number !!"
    break
  fi
  echo "$NUM"
done
echo "hello linux"

在这里插入图片描述4、添加exit,直接退出脚本

vim skk.sh

#!/bin/bash
for NUM in {1..5}
do
  if [ "$NUM" = "3" ]
  then
    echo "Luck number !!"
    exit
  fi
  echo "$NUM"
done
echo "hello linux"

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在expect执行shell脚本,可以使用spawn命令来启动一个新的shell进程,然后使用send命令向该进程发送需要执行shell命令或脚本。例如: ``` #!/usr/bin/expect spawn sh /path/to/script.sh expect "Enter your name:" send "John\r" expect "Enter your age:" send "30\r" expect eof ``` 以上脚本会启动一个新的shell进程,并执行指定的脚本。然后,它会等待脚本输出"Enter your name:",然后向该进程发送"John\r",表示输入名字为John并回车。接着,它会等待脚本输出"Enter your age:",然后向该进程发送"30\r",表示输入年龄为30并回车。最后,它会等待该进程结束并退出。 ### 回答2: 在Python中,可以使用subprocess的Popen方法以及其他相关方法来执行shell脚本。而在expect中也可以使用spawn方法来执行相应的shell脚本。 在使用Python的subprocess方法时,需要指定shell=True的参数,否则执行的脚本将会被认为是一个外部命令。同时,需要指定执行脚本的路径、参数等相关信息,并设定stdin、stdout、stderr的对象,并使用communicate方法来启动和终止进程。 而在expect中,使用spawn方法可以指定要执行的脚本,同时可以设定相应的参数、环境变量等,还可以通过interact方法来与执行过程进行交互。可以通过设置timeout等参数来控制执行时间,并通过send方法来向执行的脚本发送指令。 需要注意的是,在执行shell脚本时,需要注意脚本本身的权限问题,同时也需要注意shell脚本中的命令是否存在依赖关系,以保证脚本的正确执行。 总的来说,在Python中执行shell脚本还是比较方便的,同时也可以通过使用expect来处理交互式的脚本执行过程。无论是使用哪种方法,都需要注意安全性和有效性,并进行充分的测试和验证。 ### 回答3: 在使用expect语言时,可以通过调用shell脚本来实现比较复杂的操作或自动化流程。下面就对expect执行shell脚本进行一些详细的阐述。 首先,使用expect调用shell脚本的方法很简单,只需要使用spawn命令来启动一个shell,然后使用send或者sendline来给shell传递命令,就可以实现执行shell脚本的功能。 其次,在使用expect执行shell脚本时,有一些需要注意的地方,如需要对执行结果进行判断处理、需要跟踪执行过程、需要输出日志等等。 在处理执行结果方面,expect提供了一些操作用来判断执行的结果,如expect语句中的"expect eof"和"expect timeout",这两条命令分别用于判断shell脚本执行完成和执行超时,而在执行结果中可能还需要对执行过程中的输出进行解析和判断,可以使用expect中的正则表达式来提取所需信息。 另外,在进行自动化操作时,需要对执行过程进行跟踪和监控,可以使用expect的log命令来实现。这个命令可以将执行过程中的输出写入指定文件中,用于后续的查看和分析。可通过命令“log_file filename”实现。 最后,总结一下,expect执行shell脚本可以通过spawn命令启动一个shell,通过send和sendline命令来向shell中传递命令。执行结果可以通过expect语句中的"expect eof"和"expect timeout"命令判断,执行过程中的输出可以使用正则表达式提取信息,并使用log_file命令将输出记录到日志文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值