조건이 성공할 때까지 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 루프 테스트 조건: n5 미만?
  2. 조건이 참이면 다음과 같습니다.

    • 루프 본문은 while한 번 실행됩니다.
    • 1단계로 돌아가서 while조건을 다시 테스트하세요.

조건이 true가 아닌 경우 루프가 종료되고 스크립트는 doneloop 키워드 다음에 나오는 명령문을 계속 실행합니다.

세 번째, 프로그래머의 책임은 루프 본문 내에서 조건식의 상태를 변경하거나 변경할 수 있는 일부 작업을 수행하는 것입니다. 위의 간단한 예에서 해당 단계는 n = $(($n+1))명령문입니다. 이것이 없으면 조건이 처음에는 true이고 절대 변경되지 않기 때문에 루프는 무한해집니다. 해당 줄을 주석 처리한 상태로 스크립트를 실행하고 무슨 일이 일어나는지 살펴보세요. 그런 다음 을 누르십시오 CtrlC.

이 예제를 귀하의 특정 문제에 맞게 조정하려면 귀하 [ -z "${RT_SEQ_CHECK}" ]while경우 테스트를 무효화해야 한다고 생각합니다. 내 말은, [ -z "${RT_SEQ_CHECK}" ]true일 경우 길이가 0이라는 뜻이고 ${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})"

관련 정보