如何从shell / shell脚本获取sqlplus命令的输出状态?

时间:2014-03-21 17:02:16

标签: mysql sql bash shell sqlplus

我想从shell脚本运行一个sqlplus命令,并从shell脚本中检查sqlplus命令的状态(即成功或失败,即bash它的$?)。你能提供一些关于如何做到这一点的提示吗?

例如以下脚本可以工作,但是我对shell脚本很感兴趣,它会告诉我架构/帐户是否有" alter database link"权限与否(即shell脚本如何解释sqlplus的输出并告诉我它是成功还是失败) -

#!/bin/bash

schema=$1
password=$2
database=$3

echo "schema is $schema"
echo "password is $password"
echo "database is $database"

sqlplus -s "$schema/$password@$database" <<ENDOFSQL
SET SPACE 0
SET LINESIZE 80
SET PAGESIZE 0
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET MARKUP HTML OFF SPOOL OFF
select privilege from session_privs where PRIVILEGE = 'ALTER DATABASE LINK';
exit;
ENDOFSQL
##### END OF SCRIPT

提前致谢。 -Shashi Divekar

2 个答案:

答案 0 :(得分:1)

你在问题​​中要求两件事。首先你问一下检查“输出状态”然后你问“解释输出”,这是不同的。这是关于输出状态的第一个问题的答案,即退出代码:

...
exit;
ENDOFSQL

if [ $? -ne 0 ]; then
    echo "whoops"
else
    echo "all good"
fi
##### END OF SCRIPT

有关详细信息,请参阅the docs

答案 1 :(得分:1)

当您在 session_privs 表中查询特权列时,可以预期输出如下:

PRIVILEGE
-----------------------
CREATE VIEW
DEBUG CONNECT SESSION
CREATE SESSION
ALTER SESSION
...

我知道你已经尝试删除查询输出中无关的所有内容,但无论如何你必须检查它。这是因为sqlplus退出状态只是关于运行查询的成功或失败,而不是查询输出,所以为什么不简单地grep你要查找的权限?

...
SQLPLUS_OUTPUT=$(sqlplus -s "$schema/$password@$database" <<ENDOFSQL
select privilege from session_privs;
exit;
ENDOFSQL
) || { echo "Failed to run query"; exit 1; }

if [ -n "$(printf '%s\n' $SQLPLUS_OUTPUT | grep 'ALTER DATABASE LINK')" ]; then
    echo "Privilege located!"
else
    echo "Privilege NOT located."
fi
...