여러 조건이 있는 while 루프를 실제 조건에서 중지하는 방법은 무엇입니까?

여러 조건이 있는 while 루프를 실제 조건에서 중지하는 방법은 무엇입니까?

아래와 같이 while 루프를 제공했습니다.

#!/bin/bash
number1=1
while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do
  #number2=$(some command which can actually get a number)
  number2=200 # <<< e.g. a command that would return 
  let number1=number1+1
done

이게 내가 해야 할 일이야

null 이면 number2루프를 실행하고, 404
이면 number2루프를 실행하고, 12
가 될 때까지 루프를 실행 number2하지 않습니다 .
number1

루프를 시도하면 number2=200멈추지 않습니다. 어디에서 멈추는지 확인하는 데 number2어려움을 겪고 있는 것 같습니다 200.

number2=200대안을 사용할 수 있을 때 while 루프가 중지 되도록 이 문을 어떻게 작성할 수 있습니까 ?

답변1

number2가 null이면 루프를 실행하고, number2가 200
이면 루프를 실행합니다. number1이 12가 될 때까지 루프를 실행
하지 않습니다 .

즉, 반복하면 됩니다 (number2 is null OR number2 = 404) AND (number2 != 200) AND (number1 <= 12). 여기서는 AND와 OR의 우선순위를 명확하게 하기 위해 일종의 그룹화가 필요합니다. (Bash에서는 왼쪽에서 오른쪽으로 작동 &&하지만 ||AND 연산자는 일반적으로 OR 연산자보다 더 바인딩됩니다.)

다른 값에 어떤 일이 발생하는지 언급하지 않았지만 number2처음 두 조건을 삭제하는 것이 좋습니다. number2null 또는 404인 경우 200이 될 수 없기 때문입니다. 그래서 우리는 (number2 != 200) AND (number1 <= 12).

여기,

while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do ...

|&대신 ||및 이 있습니다 &&. 위 명령을 백그라운드에서 실행하는 |파이프라인을 나타냅니다 . &따라서 위의 코드는 세 가지 명령을 병렬로 실행합니다. 하나는 두 개의 테스트를 포함하고 다른 파이프라인은 하나의 테스트를 포함하며 둘 다 백그라운드에서 실행되고 하나의 테스트는 포그라운드에서 실행됩니다. 이것은 별로 의미가 없습니다. &&위에서 ||Bash의 논리적 조건 연산자라고 언급 했습니다 .

단순화된 형식은 다음과 같습니다.

while [ "$number2" != 200 ] && [ "$number1" -le 12 ]; do ...

("number1" 및 "number2"보다 더 설명적인 변수 이름을 사용할 수도 있습니다.)

답변2

셸의 논리 연산자는 &&및 입니다 ||. 그리고 &실제로|매우다른 것(백그라운드 작업 시작 및 두 프로세스 사이에 각각 파이프 설정)


#!/bin/sh

number1=1

while [ "$number1" -le 12 ]; do

    number2=$( some command )

    case $number2 in
        200)
            break
            ;;
        ""|404)
            # nothing
            ;;
        *)
            printf 'Unexpected: number2 = %s\n' "$number2" >&2
            exit 1
    esac

    number1=$(( number1 + 1 ))

done

의 숫자는 HTTP 상태 코드처럼 보입니다. 위 명령문의 값을 테스트하면 $number2쉘 코드를 다루기 힘든 명령문으로 만들지 않고도 여러 상태 코드가 주어지면 올바른 조치를 선택할 수 있습니다. 예를 들어,caseif어느이 모드에서는 클라이언트 또는 서버 오류 코드가 트리거될 수 있습니다 4??|5??.

이는 또한 두 변수의 의미를 논리적으로 분리합니다. 이 number1변수는 반복 횟수를 제어하는 ​​동시에 number2신비한 명령의 결과에 따라 수행되는 작업을 엄격하게 제어합니다.

관련 정보