expect避坑之expect eof

文章讲述了在使用Bash脚本通过expect连接Oracle数据库时遇到的执行问题,发现原因是expect命令没有正确匹配到Connected*,加上expecteof后解决了问题,强调了理解脚本执行原理的重要性。

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

对于如下的脚本,始终找不无法执行最后一条SQL的原因:

#!/bin/bash

/usr/bin/expect <<EOF
set timeout 10 
spawn sqlplus / as sysdba
expect "SQL>*"
send "conn\r" 
expect "Enter user-name:*" 
send "lg\r"
expect "Enter password:*" 
send "lg\r" 
expect "Connected*" 
send "select table_name from user_tables;\r" 
EOF

###############################以下为执行结果
spawn sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 1 17:03:40 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL> conn
Enter user-name: lg
Enter password: 
Connected.
SQL> [oracle@rlcora ~]$ 

一开始以为是expect "Connected*"匹配的问题,因为没匹配所以最后一条SQL无法执行。但是改成expect ".*"之后还是一无所获。

最后补充上expect eof后,才解决该问题。这个问题乍一看确实处理起来很简单,但是将近耗费了一个小时的时间。

因此得出,不仅要有术,还要明白其中的道!

最后把正确的脚本和结果贴出,仅以此篇记录自己踩过的坑。

#!/bin/bash

/usr/bin/expect <<EOF
set timeout 10 
spawn sqlplus / as sysdba
expect "SQL>*"
send "conn\r" 
expect "Enter user-name:*" 
send "lg\r"
expect "Enter password:*" 
send "lg\r" 
expect "Connected*" 
send "select table_name from user_tables;\r" 
expect eof
EOF

###################################正确的结果
spawn sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 1 17:09:41 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL> conn
Enter user-name: lg
Enter password: 
Connected.
SQL> select table_name from user_tables;

no rows selected

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lglovegq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值