bash 스크립트에서 "if"문에 조건부 "or"사용


127

이 질문은 이전 질문에 대한 속편입니다 . 이 사이트의 사용자는 for문자열 값을 반복 하는 bash 루프 를 작성하는 방법을 결정하는 데 도움이되었습니다 . 예를 들어 루프 제어 변수 fname가 문자열을 반복 한다고 가정합니다 "a.txt" "b.txt" "c.txt". echo"예!"하고 싶습니다 때 fname값을가 "a.txt"하거나 "c.txt", 및 echo"아니오!" 그렇지 않으면. 다음 bash 쉘 스크립트를 시도했습니다.

#!/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있을 때 그 진술이 사실로 드러납 니까? 잘못 사용 했습니까 ?fname"a.txt"|


3
bash에서 'or'연산자는 '||'입니다. (C 스타일).
Marius Cotofana

3
당신은 또한 -o같은 내에서 사용할 수 있습니다 [ ].
Thor

6
@Thor 내가 선호하는 것 ||및 분리 [ ]에 걸쳐 -o있기 때문에 단순히 휴대 성을 위해 [4 개 이상의 인수를 지원하지 않을 수 있습니다. 물론 대상 언어 인 경우 bash, 아무도 사용 없어야 [하기 때문에 어쨌든 bash의는 [[여러 가지면에서 우수하다.
jw013

2
@ jw013 감사합니다. 이것은 내가 사용 if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]하는 것이 아니라 사용해야한다는 것을 의미합니까 if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?
앤드류

5
@Andrew Shebang을로 선언하는 것처럼 bash이미하고있는 것처럼 맞습니다 . 한 가지 장점은 [[단어 분리 (특별한 경우)를하지 않기 때문에 [[ $unquoted_var = string ]]안전하다는 것입니다.
jw013

답변:


225

당신이 말하고 싶은 경우 OR사용 : 파이프 ( ||).

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

(원래의 OP 코드 |는 일반적인 파이프와 같은 방식으로 왼쪽의 출력을 오른쪽으로 파이핑하는 것입니다.)


4
또한 ||표준 논리 "OR"을 수행하지 않습니다. 단락되고 두 번째 명령은 첫 번째 오류가 발생한 경우에만 실행됩니다.
holdenweb

13
@holdenweb 가장 현대적인 최적화 된 언어가 같은 방식으로 작동한다고 확신합니다. OR첫 번째 조건이 true인지 평가하는 두 번째 조건을 평가하기 위해 CPU주기를 소비 할 필요가 없습니다 .
bahamat

1
나는 bash가 마음에 들었다고 생각 ==했지만이 대답을 본 후에 그것을 찾아보기로 결정했다. 분명히 "사용할 수 있지만 표준은 아닙니다". 나는 만약 내가 다른 사람을 위해 여기를 넣어 줄 알았는데 당신의 호기심 : stackoverflow.com/a/2237103
harperville

이것은 무엇을 test사람의 페이지가 너무 좋습니다
cdosborn

2
이중 대괄호 테스트를 사용할 수도 있습니다 if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]](와 관련하여 추가 기능이 필요하거나 필요한 경우 [[ ]]).
행카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.