2017-03-29 1 views
-1

bash 스크립트에서 테스트 할 특별한 조건이 있습니다.하나의 bash if 문에 두 개의 AND/OR 문이 있습니다.

if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

에서 단어 : 내가 좋아하는 뭔가에 대해 생각 categorieDG 또는 DIclient 다음 host1 또는 host2 아닙니다 물건을 할 경우.

이 정보가 맞습니까? 나에게 그것은 단지 categorie을 걱정하고있는 것처럼 보입니다. 그리고 categorie 조건이 충족되면 "요구 사항을 충족합니다"라는 내용을 인쇄하고 클라이언트 조건을 전혀 신경 쓰지 않습니다.

+1

에 테스트를 단순화하는 패턴을 비교하는 대신 다중 비교를 수행하여 주위를 얻을 수 있습니다. 모든 변수는 따옴표로 묶어서 단어 분할과 glob 확장으로 모든 문자가 중복되는 것을 피하십시오. – Jens

+0

@Jens 나는 이중 괄호가 이것을 막을 것이라고 생각 했습니까? –

+0

어쩌면, 그들은 비표준 적이기도합니다 (그들이하는 bash에서, 당신 말이 맞습니다). (POSIX 표준) 단일 대괄호는 이것을 막지 않습니다. – Jens

답변

1

영어와 논리는 서로 다른 의미를 부정적인 OR로 간주합니다. 혼동을 일으키는 것은 매우 쉽습니다.

$client에 대해 가능한 값을 생각해보십시오. 그들은 'host1', 'host2'및 'other'입니다. 값이 'host1'인 경우 ||의 두 번째 용어는 true입니다. 'host2'인 경우 ||의 첫 번째 용어는 참입니다. '기타'인 경우 ||의 두 용어가 모두 참입니다. 이는 조건이 항상 참임을 의미합니다.

클라이언트가 host1과 같지 않고 host2와 다른 경우 ||&&으로 바꿉니다.

if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
    [[ ! ("$client" = "host1" || "$client" = "host2") ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

는 테스트 스크립트로 퍼팅 :로 번역 할 수

if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
    [[ "$client" != "host1" && "$client" != "host2" ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 

또는 사용 !(client == host1 || client == host2)

for categorie in DG DI XX 
do 
    for client in host1 host2 other 
    do 
     if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
      [[ "$client" != "host1" && "$client" != "host2" ]]; then 
      echo "(categorie $categorie; client $client): requirements are met" 
     else 
      echo "(categorie $categorie; client $client): requirements not met" 
     fi 
     if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] && 
      [[ ! ("$client" = "host1" || "$client" = "host2") ]]; then 
      echo "(categorie $categorie; client $client): requirements are met" 
     else 
      echo "(categorie $categorie; client $client): requirements not met" 
     fi 
    done 
done 

출력 : 라인의

(categorie DG; client host1): requirements not met 
(categorie DG; client host1): requirements not met 
(categorie DG; client host2): requirements not met 
(categorie DG; client host2): requirements not met 
(categorie DG; client other): requirements are met 
(categorie DG; client other): requirements are met 
(categorie DI; client host1): requirements not met 
(categorie DI; client host1): requirements not met 
(categorie DI; client host2): requirements not met 
(categorie DI; client host2): requirements not met 
(categorie DI; client other): requirements are met 
(categorie DI; client other): requirements are met 
(categorie XX; client host1): requirements not met 
(categorie XX; client host1): requirements not met 
(categorie XX; client host2): requirements not met 
(categorie XX; client host2): requirements not met 
(categorie XX; client other): requirements not met 
(categorie XX; client other): requirements not met 

쌍 항상 same - 표현식은 동일합니다. 그리고 결과는 당신이 원하는 것입니다.

+0

고맙습니다. 이거예요. 나는 클라이언트 검사에서'||'대신'&&'를 사용한다. 나는 부정 된 OR이 무엇이든 일치 할 것이라고 생각하지 않았습니다. –

0

정확합니다. 모든 문자열은 항상 서로 다른 두 문자열 중 적어도 하나와 같지 않으므로 && 이후의 부분은 항상 true입니다.

0

당신은 부정하거나 잘못된 일을 인용하는

if [[ $categorie == D[GI] ]] && [[ $client != host[12] ]]; then 
    echo "requirements are met" 
else 
    echo "requirements not met" 
fi 
관련 문제