我想从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
答案 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
...