如何退出 expect 和 bash 脚本

How to exit from expect and bash script

我在 for 循环 bash 脚本中编写了一个 expect 脚本。当在 expect 脚本期间满足条件时,脚本将使用 'exit' 命令退出。但它将进入 bash 脚本并再次进行下一次迭代。如果我在 bash 脚本中提供 break 语句,它将影响所有条件。请建议我如何实现它。

for i in `cat /tmp/downtimehosts.txt`
do
{
y=$( expr $y + 1 )
j=$(echo $i | awk -F. '{print }')
host=$(cat /tmp/ipmon_host_db.txt | grep $j | awk '{print }')
ipmon=$(cat /tmp/ipmon_host_db.txt | grep $j | awk '{print }')

if [ $? -eq 0 ]
then
{
/usr/bin/expect -c "
spawn ssh $username@$ipmon
expect {
-re ".*Are.*.*yes.*no.*" {
send \"yes\r\"
exp_continue
}
"*?ssword:*" {
send \"$password\r\"
expect "password" {
send "quit\r"
exit
}
}}
expect "denied" {
send "quit\r"
exit
}
expect "~]$"
send \"sudo su -\r\"
expect "password"
send \"$password\r\"
expect "~]"
send \"/apps/bin/schedule-downtime.pl -v -h "$host" -d 
"$his"\r\"
expect "~]"
send \"logout\r\"
expect "~]"
send \"logout\r\"
expect eof"
}
else
:
fi
}
done

上面如果密码错误,必须退出expect脚本和bash脚本。

如果您的 expect 脚本中有错误,return 一个非零值,例如 exit 23

然后在您的 bash 代码中,使用 $? 检查结果。如果不为零,break 跳出循环:

ret_val=$?
if [ $ret_val -ne 0 ]; then
   break
fi