迭代 if else 语句,直到条件成功

迭代 if else 语句,直到条件成功

我写了下面的代码块

#!/bin/bash

TABLE_NAME="${1}"
COL_NAME="${2}"

FIELD_VALUES_1SQ_FUNC()
{
        FIELD_VALUES_1SQS=`sqlplus -s sab/admin@TERM << EOF
        SET FEEDBACK OFF;
        SET HEADING OFF;
        Select TESTING.FIELD_VALUES_TEMP_1SQ.NEXTVAL from dual;
        exit;
EOF`
        FIELD_VALUES_1SQ=`echo ${FIELD_VALUES_1SQS} | tr -d ' '`
}

RT_SEQ_CHECK_FUNC()
{
        RT_SEQ_CHECKS=`sqlplus -s sab/admin@TERM << EOF
        SET FEEDBACK OFF;
        SET HEADING OFF;
        Select * from TESTING.FIELD_VALUES where FIELD_ROW_ID='${1}' and TF_ID='${2}';
        exit;
EOF`
        RT_SEQ_CHECK=`echo ${RT_SEQ_CHECKS} | tr -d ' '`
}

RT_FIELD_IDS_FUNC()
{
        RT_FIELD_IDS=`sqlplus -s sab/admin@TERM << EOF
        SET HEADING OFF;
        SET FEEDBACK OFF;
        select max(TF_ID) from TESTING.TABLE_FIELD where field_id in(select field_id from TESTING.FIELD_DOMAIN where name='${2}') and table_id in (select table_id from TESTING.TABLE where name='${1}');
        EXIT;
EOF`
        RT_FIELD_ID=`echo ${RT_FIELD_IDS} | tr -d ' '`
}

        FIELD_VALUES_1SQ_FUNC

        RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}

        RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
        if [ -z "${RT_SEQ_CHECK}" ]
        then
                echo "Sequence values doesn't exist |--${RT_SEQ_CHECK}--|"
        else
                echo "SEQUNCE VAlue exists |--${RT_SEQ_CHECK}--|"
        fi
echo "TF_ID=${FIELD_VALUES_1SQ}"
echo "FIELD_ROW_ID=${RT_FIELD_ID}"
exit $?

在我的脚本中,首先我调用该函数FIELD_VALUES_1SQ_FUNC来生成序列号。

其次,我打电话RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}给它会得到一些价值。

第三,RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}调用该函数,检查该值是否存在于数据库中。如果该值存在,那么我应该FIELD_VALUES_1SQ_FUNC()再次调用以生成新的序列值并使用函数检查它,除非在函数RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}中找不到该选择的值。FIELD_VALUES_1SQ_FUNC()

关于如何实现这一目标的任何想法!

答案1

您正在寻找的称为while循环。考虑这个简单的例子:

n=0
while [ $n -lt 5 ]; do
  echo Not done yet
  n=$(($n+1))
done

while 循环做了两件事,并且暗示程序员必须做第三件事。

  1. while 循环测试条件:n小于 5?
  2. 如果条件为真,则:

    • 循环体while执行一次
    • 循环while返回步骤 1 并再次测试条件

如果条件不为真,则循环终止,脚本继续执行done循环关键字后面的语句。

第三件事,即程序员的责任,是在循环体内执行一些操作,这将(​​或可能)更改条件表达式的状态。在上面的简单示例中,该步骤就是n = $(($n+1))语句。如果没有这个,循环将变得无限,因为条件最初为真并且永远不会改变。尝试运行注释掉该行的脚本,看看会发生什么。然后按CtrlC

为了根据您的具体问题定制此示例,我认为您需要根据[ -z "${RT_SEQ_CHECK}" ]您的while情况否定测试。我的意思是,当[ -z "${RT_SEQ_CHECK}" ]为真时,这意味着${RT_SEQ_CHECK}长度为零,而这就是您想要的时候停止循环播放。幸运的是,test有一个-n与该选项完全相反的选项-z

因此,从广义上讲,您的while循环大致如下所示:

FIELD_VALUES_1SQ_FUNC
RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}

while [ -n "${RT_SEQ_CHECK}" ]; do

    FIELD_VALUES_1SQ_FUNC
    RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
    RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}

done

最后,我希望对您的代码结构提出建设性的评论。您倾向于使用全局变量从函数返回值,然后在代码主体中引用这些全局变量。这可能会使代码难以阅读和遵循。而不是用这种风格编码:

STEP1() {
  DATE=$(date)
}

STEP2() {
  echo "today is $DATE"
}

STEP1
STEP2

尝试这个:

STEP1() {
  date
}

STEP2() {
  echo "today is $1"
}

DATE="$(STEP1)"
STEP2 "$DATE"

同样,应用您的代码可能会导致类似这样的结果:

FIELD_VALUES_1SQ_FUNC()
{
        sqlplus -s sab/admin@TERM << EOF | tr -d ' '
        SET FEEDBACK OFF;
        SET HEADING OFF;
        Select TESTING.FIELD_VALUES_TEMP_1SQ.NEXTVAL from dual;
        exit;
EOF 
}

RT_SEQ_CHECK_FUNC()
{
        sqlplus -s sab/admin@TERM << EOF | tr -d ' '
        SET FEEDBACK OFF;
        SET HEADING OFF;
        Select * from TESTING.FIELD_VALUES where FIELD_ROW_ID='${1}'
                  and TF_ID='${2}';
        exit;
EOF 
}

RT_FIELD_IDS_FUNC()
{
        sqlplus -s sab/admin@TERM << EOF | tr -d ' '
        SET HEADING OFF;
        SET FEEDBACK OFF;
        select max(TF_ID) from TESTING.TABLE_FIELD 
           where field_id in (select field_id from TESTING.FIELD_DOMAIN where name='${2}') 
             and table_id in (select table_id from TESTING.TABLE where name='${1}');
        EXIT;
EOF 
}

        FIELD_VALUES_1SQ="$(FIELD_VALUES_1SQ_FUNC)"

        RT_FIELD_ID="$(RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME})"

        RT_SEQ_CHECK="$(RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID})"

相关内容