对于如下的脚本,始终找不无法执行最后一条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