Bash에서 루프의 시작 부분으로 이동

Bash에서 루프의 시작 부분으로 이동

for 루프에서 if 조건을 사용하고 있습니다. if 조건이 yes를 반환하면 for 루프의 시작 부분으로 다시 이동하고 싶습니다. 배쉬에서 이것이 가능합니까?

#!/bin/bash
for i in /apps/incoming/*.sql
do
j=$(egrep "[A-Z]{6}[ ]{1}[@abc_id]{10}[ ]{1}[=]{1}[ ]{1}[0-9]*" $i | awk '{ print $4 }')
#echo $j

#Query database

export ORACLE_HOME=/apps/uc/tmd/oracle/instantclient_11_2
export LD_LIBRARY_PATH=/apps/uc/tmd/oracle/instantclient_11_2
sqlplus=/apps/oracle/instantclient_11_2/sqlplus

tmprnt=$($sqlplus -s abcsd/sakfdj@'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = odsakjfldkjf)(PORT = 1111)))(CONNECT_DATA =(SERVICE_NAME = SFDDFD)(SRVR = DEDICATED)))' << EOF

SELECT name from blabla where abc_id='$j';
EOF)

if `echo ${tmprnt} | grep "${searchString1}" 1>/dev/null 2>&1`
then
  GO TO the start of FOR IN loop and run the query again. 

따라서 IF 조건 내의 위 tmprnt 변수가 검색 문자열과 일치하면 다시 실행하고 싶습니다(SQL 쿼리는 때때로 "선택된 행 없음"을 반환하지만 다시 실행하면 어떻게든 올바른 결과를 반환합니다). Bash에는 GO TO가 없다는 것을 알고 있습니다. 탈출구를 제안해주세요.

답변1

continue다음 쿼리를 계속하려면 이 문을 사용하세요 .

동일한 쿼리를 반복하려면 루프를 사용하세요. 쿼리를 반복하고 싶으므로 사용 중인 언어에 존재하지 않는 낮은 수준의 구문으로 의도를 가리는 대신 이를 수행하는 스크립트를 작성하세요.

for i in /apps/incoming/*.sql
do
  while
    j=$(…)
    ! echo "${tmprnt}" | grep "${searchString1}" 1>/dev/null 2>&1
  do
    … # whatever you want to do when $tmprnt has the right format
  done
done

귀하가 의도한 대로 작성한 조건문을 수정했습니다. 실행 출력이 grep의미가 없습니다. 반품변수와 명령 대체에는 큰따옴표를 넣어야 합니다..

여기서 논리를 참고하세요. 검색 문자열은 다음과 같습니다.아니요존재하는 경우 쿼리를 반복하십시오.

스크립트는 긴밀한 루프로 데이터베이스를 쿼리하므로 여기에 뭔가가 빠졌습니다(질문을 단순하게 유지하기 위해 코드를 생략하길 바랍니다).

답변2

예, 방법이 있습니다. 하지만 이는 단지 해결 방법일 뿐이므로 개발 중인 새 스크립트에서는 절대로 사용해서는 안 됩니다.

.BAT하지만 데스크탑에서 Windows에서 Linux로 옮겼을 때 변환해야 할 기존 파일이 많았고 .CMD이에 대한 논리를 다시 작성할 생각이 없었습니다.확립된gotoBash에서 이를 수행하는 한 가지 방법은 실행되어서 는 안되는 스크립트 부분을 제거하기 위해 자체적으로 goto function실행된 다음 모두 평가하기 때문에 작동합니다.sed

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo "$goto_msg"

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

Linus Torvalds가 말했듯이 나는 전혀 죄책감을 느끼지 않습니다.

보낸 사람: Linus Torvalds
제목: 답장: 2.6.0-테스트*의 가능성이 있습니까?
날짜: 2003년 1월 12일 일요일 11:38:35 -0800(PST)

나는 gotos가 좋다고 생각하며, 일반적으로 들여쓰기를 많이 하는 것보다 더 읽기 쉽습니다. 그건특히코드 흐름이 실제로 자연스럽게 들여쓰기되지 않은 경우 True입니다(이 경우에는 그렇기 때문에 goto를 사용하는 것이 의미가 없다고 생각합니다).더 명확하게아니요, 하지만 일반적으로 goto는 매우 읽기 쉽습니다.)

물론, 레이블이 설명적일 수 없는 Pascal과 같은 어리석은 언어에서는 goto가 나쁠 수 있습니다. 그러나 이것은 goto의 잘못이 아니라 언어 디자이너의 두뇌 장애입니다.

코드의 원본 소스 (오류 가능성을 줄이도록 수정했습니다)
인용 출처

관련 정보