使用 bash 脚本读取 oracle 查询的输出

Read output of an oracle query with a bash script

我正在尝试设置一个 bash 脚本,在该脚本中连接到 Oracle 实例以检查计划的各种 dba 作业,如果特定作业不是 运行ning 我需要显示一个错误信息。

这是我编写的脚本,它部分有效,该脚本仅在到达 IF 语句之前有效

#!/usr/bin/env bash
#write output of the sql query to an output file 
output_file="/tmp/datatool_output.csv"
> $output_file

echo "
SET FEED OFF
SET PAGESIZE 0
SET COLSEP ,
SET linesize 100
SET TRIMSPOOL ON
SET TRIMOUT ON


SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS where job_name ='run_LoadDatatoolStore';

exit" | sqlplus -s sqlplus -s "username/password@dbip:dbport/SID" >> $output_file

     a_var=($(awk -F',' '{print }' $output_file | sed 's/\s//g' | xargs))


for item in ${a_var[@]}
 do
val=$(echo $item  | awk -F',' '{print }')

if [[ $val -eq "SCHEDULED"  ]] || [[  $val -eq "RUNNING" ]] ; then
     echo "OK: The job LoadDatatool is either Scheduled or in the Running state"
     exit 0 # this is used for interpretation by nagios to display no alert alert
else [[ $val -eq "BLOCKED" ]]
     echo "CRITICAL: The Db scheduler job LoadDatatool is in a Blocked state"
      exit 2
fi

我明白了

test.sh: line 24: syntax error: unexpected end of file

当我 运行 脚本时,我们将不胜感激。

谢谢, 卡尔提克

你应该这样重写你的if

if [[ $val -eq "SCHEDULED"  ]] || [[  $val -eq "RUNNING" ]] ; then

成为

if [[ $val = "SCHEDULED"  ]] || [[  $val = "RUNNING" ]] ; then

if [[ $val = "SCHEDULED"  || $val = "RUNNING" ]] ; then

-eq用于比较数字,=用于比较字符串

P.S。此外,您可以使用 sqlplusSPOOL 功能来代替 sqlplus 的重定向输出 而不是这个丑陋的 echo 你可以在文件中写入 sql 并从命令行执行它,如:

sqlplus -s "username/password@dbip:dbport/SID" @sql_script.sql

在脚本末尾添加done