Bash 스크립트에서는 "if" 문에 조건부 "or"를 사용합니다.

Bash 스크립트에서는 "if" 문에 조건부 "or"를 사용합니다.

이 질문은 내 질문의 후속입니다.이전 질문. 이 사이트의 사용자들은 for문자열 값을 반복하는 bash 루프를 작성하는 방법을 알아내는 데 친절하게 도움을 주었습니다 . 예를 들어, 루프 제어 변수가 fname문자열을 반복한다고 가정합니다 "a.txt" "b.txt" "c.txt". 값이 있으면 echo"예!"를 원 하고 그렇지 않으면 "아니요!"를 원합니다 . 다음 bash 쉘 스크립트를 시도했습니다.fname"a.txt""c.txt"echo

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
  echo $fname
  if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
    echo "yes!"
  else
    echo "no!"
  fi
done

나는 출력을 얻습니다 :

a.txt

아니요!

b.txt

아니요!

c.txt

예!

if이 진술 에 값이 있는데 왜 분명히 true가 되는 걸까요 ? 제가 잘못 사용한 걸까요?fname"a.txt"|

답변1

말하고 싶다면 OR이중 파이프( ||)를 사용하세요.

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(원래 사용된 OP 코드는 |일반 파이프가 작동하는 것과 같은 방식으로 출력을 왼쪽에서 오른쪽으로 단순히 파이프했습니다.)


수년간의 논평과 오해 끝에, 제가 명확히 설명하겠습니다.

OR귀하의 사용을 위해 ||.

사용 여부는 [상황 [[에 따라 달라집니다 test. ((모든 상황에서 둘 중 하나가 선호된다고 말하는 것은 잘못된 것입니다. 때로는 [맞을 때도 있고, [[틀릴 때도 있습니다. 그러나 그것은 문제가 아닙니다. OP는 왜 |작동하지 않는지 물었습니다. 대답은 그 ||반대여야 하기 때문입니다.

답변2

허용되는 답변은 훌륭하지만 bash를 사용하고 있으므로 bash 솔루션을 추가하겠습니다.

if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then

이는 bash 참조 매뉴얼에 문서화되어 있습니다.3.2.4.2 조건부 구성

식1 && 식2

표현식1과 표현식2가 모두 참이면 참입니다.

식1 ||식2

표현식1 또는 표현식2가 참이면 참입니다.

&& 및 || 연산자는 표현식 1의 값이 전체 조건식의 반환 값을 결정하기에 충분한 경우 표현식 2를 평가하지 않습니다.

답변3

이와 같이 OR 조건을 사용할 수도 있습니다.

if test "$fname" = "a.txt" || test "$fname" = "c.txt"

답변4

이렇게 사용하거나 조정할 수 있습니다

 if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]

관련 정보