![여러 조건이 있는 while 루프를 실제 조건에서 중지하는 방법은 무엇입니까?](https://linux55.com/image/144547/%EC%97%AC%EB%9F%AC%20%EC%A1%B0%EA%B1%B4%EC%9D%B4%20%EC%9E%88%EB%8A%94%20while%20%EB%A3%A8%ED%94%84%EB%A5%BC%20%EC%8B%A4%EC%A0%9C%20%EC%A1%B0%EA%B1%B4%EC%97%90%EC%84%9C%20%EC%A4%91%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
아래와 같이 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
처음 두 조건을 삭제하는 것이 좋습니다. number2
null 또는 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
쉘 코드를 다루기 힘든 명령문으로 만들지 않고도 여러 상태 코드가 주어지면 올바른 조치를 선택할 수 있습니다. 예를 들어,case
if
어느이 모드에서는 클라이언트 또는 서버 오류 코드가 트리거될 수 있습니다 4??|5??
.
이는 또한 두 변수의 의미를 논리적으로 분리합니다. 이 number1
변수는 반복 횟수를 제어하는 동시에 number2
신비한 명령의 결과에 따라 수행되는 작업을 엄격하게 제어합니다.