编写Shell脚本

时间:2015-08-17 16:06:17

标签: linux oracle shell conditional-statements

我正在尝试编写一个shell脚本,它本质上会查询给定的条件。这是捕获。我希望它重复查询持续3分钟。 (可能运行查询,并睡2秒)

1分钟后,在任何时候如果查询返回null,for循环将中断。 (主要目标是检测查询是否一致地返回结果持续3分钟)

1分钟后如何在下面的代码中加入BREAK语句的检查? (SPOOL会覆盖文件的内容还是附加?)

let g:syntastic_scss_checkers=['']

1 个答案:

答案 0 :(得分:2)

最简单的方法是捕获sqlplus的输出,然后测试结果字符串是否为空。为了便于阅读,我将sqlplus的调用放在一个函数中。鉴于您正在使用的for语句的形式,我还假设您正在使用bash

run_query () {
sqlplus -s username/passwd@SERVICENAME <<EOF
# [deleted]
EOF
}

# SECONDS is incremented each second, so can be used as
# a simple timer.
SECONDS=0

# For the first minute, just run the query
while (( SECONDS <= 60 )); do
    output=$(run_query)
    sleep 2
done

# After the first minute, continue running the query for the
# next two minutes, but quit if the query produces no output.
while (( SECONDS <= 180 )); do
    output=$(run_query)
    if [[ -z $output ]]; then
        break
    fi
    sleep 2
done

或者,您可以组合两个循环并使用稍微复杂的条件:

while (( SECONDS <= 180 )); do
    output=$(run_query)
    # Don't break for any reason during the first 60 seconds
    if ((SECONDS > 60)) && [[ -z $output ]]; then
        break
    fi
    sleep 2
done

如果您没有使用bash,则可以通过调用date来模拟计时器:

start=$(date +%s)
while now=$(date +%s); SECONDS=$(( now - start)); [ "$SECONDS" -le 180 ]; do
    output=$(run_query)
    if [ "$SECONDS" -gt 60 ] || [ -n "$output" ]; then
        break
    fi
    sleep 2
done