打破Bash的循环

时间:2019-07-10 11:05:01

标签: bash amazon-web-services loops while-loop

我想检查还原后AWS中的数据库集群是否可用,并继续执行脚本的其余部分: 这是要检查的Bash脚本:

echo "Checking if $TARGET_CLUSTER_ID-test reached Available state"
while [ "${cluster_available}" != "available" ]
do
    echo "Waiting for $TARGET_CLUSTER_ID-test to enter Available state"
    aws rds describe-db-clusters --db-cluster-identifier $TARGET_CLUSTER_ID-test --query 'DBClusters[0].[Status]' --output text
    cluster_available="$?"
    CLUSTER_STATUS=$(aws rds describe-db-clusters --db-cluster-identifier $TARGET_CLUSTER_ID-test --query 'DBClusters[0].[Status]' --output text)
    echo "$TARGET_CLUSTER_ID-test instance state is: ${CLUSTER_STATUS}"
done

不幸的是,当群集可用时,它不会停止。相反,它正在使用以下命令继续充斥终端:

cluster-name instance state is: 
Waiting for cluster-name-test to enter Available state
available
cluster-name-test instance state is: 
Waiting for cluster-name-test to enter Available state
available

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

您将cluster_available设置为数字(aws的退出代码),但针对字符串 available 进行了测试。当然,这总是不平等的。

我不知道aws如何表明可用性,但是测试$CLUSTER_STATUS可能是一个更好的主意。

此外,在一次循环迭代中两次执行aws rds describe-db-clusters也没有意义。

答案 1 :(得分:1)

在调试模式下运行bash脚本始终是一个好习惯,在调试模式下,您想测试字符串的相等性,并在进行远程调用的while循环中放置一些睡眠。因此,这就是我修改脚本的方式,并且能够验证RDS状态。

#!/bin/bash
# set -x
echo "Checking if $TARGET_CLUSTER_ID-test reached Available state"
time=0
CLUSTER="adiltest-ejabberd-db"
while [ "${cluster_available}" != "available" ]
do
    echo "checking RDS availiblity"
    status=$(aws rds describe-db-clusters --db-cluster-identifier "${CLUSTER}" --query 'DBClusters[0].[Status]' --output text)
    if [ $status == "available" ];then 
    echo "RDS is availble"
    cluster_available="available"
    else
    echo "Waiting for $CLUSTER to enter Available state"
    sleep=2
    echo $time  "Seconds Elapsed"
    time=$((time + 2))
    fi
done

这是输出

enter image description here

更新:添加经过的时间

enter image description here