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

Posted

技术标签:

【中文标题】如何从 shell/shell 脚本获取 sqlplus 命令的输出状态?【英文标题】:How to get output status of sqlplus command from shell/shell script? 【发布时间】:2014-03-21 17:02:15 【问题描述】:

我想从 shell 脚本运行 sqlplus 命令并从 shell 脚本检查 sqlplus 命令的状态(即成功或失败,即在 bash 中它是 $? )。你能给我一些提示吗?

例如以下脚本可以工作,但我对一个 shell 脚本感兴趣,它会告诉我架构/帐户是否具有“更改数据库链接”权限(即 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

【问题讨论】:

【参考方案1】:

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

...
exit;
ENDOFSQL

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

请参阅the docs 了解更多信息。

【讨论】:

感谢 dg99。我正在寻找“sqlplus”命令的退出代码。即,如果架构/帐户具有“ALTER DATABASE LINK”权限,那么我想打印“OK”之类的内容,否则打印“Not OK”。只需检查“$?”在这种特殊情况下无济于事。【参考方案2】:

当您在 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
...

【讨论】:

以上是关于如何从 shell/shell 脚本获取 sqlplus 命令的输出状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在shell脚本中执行cd命令

shell脚本基础知识详解

shell--3Shell 传递参数

shell脚本编程

什么是Shell脚本?Shell脚本在Linux运维工作中的地位!

Linux之Shell脚本编程