整数表达式预期的外壳脚本 - BASH



我正在尝试使用以下shell脚本在主数据库和备用数据库之间获取LAG。对于具有 1 个返回单个值的节点的实例,查询返回值"数据库不同步"或"数据库不同步"工作正常,但是对于具有两个节点的实例,我收到错误"[: 0 1:预期的整数表达式",该实例返回第一个节点和第二个节点上的 LAG 的两个值。

所以这是代码:

#!/bin/bash
get_status=$(sqlplus -s "/as sysdba" <<EOF

set pagesize 0 feedback off verify off heading off echo off;

SELECT prim.seq - tgt.seq seq_gap

FROM

(

SELECT thread#, MAX(sequence#) seq, MAX(completion_time) tm

FROM

v$archived_log

GROUP BY

thread#

) 

prim,

(

SELECT thread#, MAX(sequence#) seq, MAX(completion_time) tm

FROM

v$archived_log

WHERE

dest_id IN 

(

SELECT

dest_id

FROM

v$archive_dest

WHERE

target = 'STANDBY'

)

AND 

applied = 'YES'

GROUP BY

thread#

) 

tgt

WHERE

prim.thread# = tgt.thread#;

exit;
EOF
)
if [ "$get_status" -ge 5 ]; then

echo "DATABASE IS OUTOFSYNC"
else

echo "DATABASE IS INSYNC"
fi

有没有更好的方法来编写这个脚本?

在查询之后和之前添加typeset -p get_status之后,如果我得到以下结果:

declare -- get_status=" 1
0"
./dgtest2.sh: line 41: [: 1
0: integer expression expected
DATABASE IS INSYNC

查询返回多个值/字符串(针对 2 个节点或线程),如图/屏幕截图所示,似乎我的脚本仅编码为处理查询生成的单个值/字符串。

在此处输入图像描述

是否可以修改脚本以解决查询生成的多个值/字符串

逻辑应该是如果返回的所有值都-ge 5它应该报告其他"DATABASE IS OUTOFSYNC""DATABASE IS INSYNC"对于返回的所有值都是-lt 5

一个值-lt 5和一个值-ge 5的逻辑是不够的,因为数据库中的值会不断变化。

数据库从0 - 4中返回的任何值是否应报告为"DATABASE IS INSYNC",数据库从两个节点返回的5 upwards中的任何值是否应报告为"DATABASE IS OUTOFSYNC"

一个想法是将状态值(由sqlplus脚本返回)捕获到数组中,然后循环访问测试所述状态值的数组。

而不是:

variable=$(sqlplus ...)

我们希望:

variable=( $(sqlplus ...) )

对于 OP 的当前脚本,通过更改变量的名称,我们将替换它:

get_status=$(sqlplus -s "/as sysdba" <<EOF
set pagesize 0 feedback off verify off heading off echo off;
SELECT prim.seq - tgt.seq seq_gap
... 
exit;
EOF
)

有了这个:

status_array=( $(sqlplus -s "/as sysdba" <<EOF
set pagesize 0 feedback off verify off heading off echo off;
SELECT prim.seq - tgt.seq seq_gap
...
exit;
EOF
) )

后续逻辑测试的一个想法:

  • 默认数据库状态为INSYNC
  • 如果-ge 5任何状态值,则将数据库状态设置为OUTOFSYNC

此代码如下所示:

db_status='INSYNC'
for status in "${status_array[@]}"
do
[[ "${status}" -ge 5 ]] && db_status='OUTOFSYNC' && break
done
echo "DATABASE IS ${db_status}"

我没有设置为运行sqlplus脚本,但我应该能够使用以下数组分配模拟结果:

status_array=(1)
status_array=(7)
status_array=(0 1)
status_array=(5 7)
status_array=(5 3)

为每个数组赋值运行我们的代码会给我们:

##################### status_array=(1)
DATABASE is INSYNC
##################### status_array=(7)
DATABASE is OUTOFSYNC
##################### status_array=(0 1)
DATABASE is INSYNC
##################### status_array=(5 7)
DATABASE is OUTOFSYNC
##################### status_array=(5 3)
DATABASE is OUTOFSYNC

相关内容

  • 没有找到相关文章

最新更新