2014-01-16 2 views
21

내가 bashscript의 다음과 같은 부분이 있습니다 아무리에만 허용하려는 때문에 입력 (정확하고 잘못된 값)이 다시 함수를 호출하지 무엇bash는 문자열이 여러 올바른 값으로 비교

function get_cms { 
    echo "input cms name" 
    read cms 
    cms=${cms,,} 
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then 
     get_cms 
    fi 
} 

하지만를 그 3 개의 입력 중 1 개. 나는 이것을 시도했다. || [var! = value] 또는 [var! = value1] 또는 [var! = value1] 과 함께 작동하지만 아무 것도 작동하지 않습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까? 대신 말하는

+0

의 중복 가능성 [문자열이 하나의 동일 여부를 확인하는 경우 문 배쉬 여러 문자열 리터럴] (http://stackoverflow.com/questions/22259259/bash-if-statement-to-check-if-string-is-equal-to-one-of-several-string-literals) –

답변

21

는 :

if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then 

말 :

if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then 

당신은 또한 Conditional Constructs를 참조 할 수 있습니다.

+0

그 공장. 어떻게 내가 이것을 놓칠 수 있었 을까? – eagle00789

+0

''$ cms "! ='를 반복해서 쓰고 다시는별로 드라이하지 않습니다. 어떤 경우 에든 오타가 남을 수 있습니다 (예 :''$ csm "! ='). 쉘 안에는 컴파일러가 없습니다. 변수 이름을 반복하지 않는 것이 좋습니다. (내 대답을 참조하십시오.) – Alfe

24

어쩌면 당신은 더 나은 같은 목록에 대한 case을 사용해야합니다

case "$cms" in 
    wordpress|meganto|typo3) 
    do_your_else_case 
    ;; 
    *) 
    do_your_then_case 
    ;; 
esac 

나는이 더 잘 읽을 수있는 긴 같은 목록에 대한 생각합니다. 여전히이 if 당신은 두 가지 방법으로 하나의 괄호와 함께 할 수 원하는 경우

는 :

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then 

또는

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then 
+1

잘 작동합니다! btw, arent "do_your_then | else_case"텍스트 팁이 뒤집 혔습니까? :) –

+1

OP는 ≠ ('! =');를 사용하여 그의 원래 조건을 공식화했습니다. 내 버전이'case'와 일치하기 때문에 (오히려'='와의 비교를 사용합니다), 따라서 반전합니다. – Alfe

+1

아름다운 솔루션입니다. 이런 경우 사용과 관련된 문제가 있습니까? – Xiao

2

여기 내 솔루션

if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then 
+3

extglob에서'+'가 아니라'@'. 그렇지 않으면 'wordpressmagento'또는 'typo3typo3'과 같이 잘못된 결과가 표시됩니다. –

29

주요 목적은 만약의 제공된 값이 목록에 없는지 확인하는 것입니다. 아마도 ext 정규 표현식은 "동일 물결표"연산자를 통해 BASH 내장 매칭 끝났다 (또한 this answer 참조)

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi 

이 좋은 하루를 가지고

관련 문제