Bash에서 두 문자열 비교


22

if내 bash 스크립트에 다음 블록이 있습니다.

if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
  echo "successfully entered if block!!"
fi

스크립트 실행이 내 입력되지 않은 if블록이 비록 $PACKAGENAME같다 kakadu-v6_4-00902C. 내가 무엇을 잘못하고 있지?


9
-eq정수의 경우 문자열 또는 정규식 ( ==또는 =~) 을 테스트하려고합니다 . mywiki.wooledge.org/BashGuide/TestsAndConditionals
jasonwryan

감사 jasonwryan합니다.이 리소스를 살펴 보겠습니다.
DemiSheep

답변:


31

-eq 산술 연산자로 두 숫자를 비교합니다.

사용 =(휴대용 / 표준 sh), =~또는 ==대신.

${PACKAGENAME}공백이나 와일드 카드 문자 가 포함되어 있으면 여러 인수로 분할 [되므로 원하는 것보다 많은 인수를 볼 수 있으므로 따옴표도 사용 하십시오. 일반적인 bash 함정 목록을 참조 하십시오 .

if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
fi

에 대한 man bash검색 ( /)을 참조하십시오 CONDITIONAL EXPRESSIONS.


1
아! 고맙습니다! 효과가 있었다! 나는 이것에 대해 분명히 신인이다. 도와 주셔서 감사합니다!
DemiSheep

2
tldp.org/LDP/Bash-Beginners-Guide/html보셨습니까 ? 아주 좋은 배쉬 가이드이며 예제와 시험에 도움이 될 것입니다 :).
polym

1
감사 polym합니다. 리소스를 찾아 주셔서 감사합니다. VI 가이드 옆에있는 탭을 엽니 다. :)
DemiSheep

4
이중 괄호 안에는 단어 분할이 수행되지 않으므로 [[ $PACKAGENAME == "kakadu..." ]]괜찮습니다.
glenn jackman

4
심지어 이중 괄호 안에, 당신의 오른쪽에 변수 확장 주위에 따옴표를 필요로하지만 조심 @glennjackman =, ==그리고 !=그 측면이 패턴이 아닌 문자열이기 때문에. 예를 들어, foo='*'; [[ whatever = $foo ]]사실입니다.
Gilles 'SO- 악한 중지'


4

또 다른 방법은 그들을 부정하는 것입니다.

: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
    echo '$PACKAGENAME is not kakadu-v6_4-00902C' 
    exit 1
} >&2

위의 블록은 먼저 "$PACKAGENAME"값이 있는지 테스트 하고, 그렇지 않으면 오류로 종료되고에 에코 ?'this'}됩니다 stderr. 부모 쉘이 여전히 존재하면 테스트가 통과 된 후 변수에서 'kakadu ...'문자열을 제거하면 -z빈 문자열이 생성되는지 테스트 합니다. 그렇지 않으면 다시 오류가 발생하고 쉘을 종료합니다. 이 시점에서 쉘이 여전히 존재한다면, 블록이 실행 된 후에 어떤 것이라도 그렇지 않으면 그렇지 않습니다.

아마도 이런 종류의 기능은 함수에서 가장 잘 구현됩니다. 처럼:

argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
    z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
    until z "${2+?}" $((i=i+1)) #until $2 is not set...
    do  ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
        exit $((i${1:++1})) #exit $? == failed arg count
    shift ; done #shift away one param ; continue loop
)

이 기능을 사용하면 시스템이 허용하는 한 많은 인수를 제공 할 수 있습니다. 2보다 작은 값을 제공하면 1을 반환하고에 메시지를 보냅니다 stderr. 둘 이상의 인수를 제공하면 모두 문자열로 취급하고 모두 동일하고 null이 아닌 경우 0을 반환하고 그렇지 않으면 인수 검사를 먼저 실패한 인수 번호를 반환합니다.

귀하의 경우 다음과 같이 사용할 수 있습니다 :

{   
    PACKAGENAME='kakadu-v6_4-00902C'
    argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
        echo failure
    ! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
        echo failure
}

###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C

더 설명하기 위해 다른 함수를 작성하겠습니다.

aeqecho() { i=$((i+1)) #inc for line#
    argeq "$@" && echo "$i : yay" || #allswell or
    ! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
    echo "$i : shite - arg$e failed" #report failure
}

데모:

{  i= s=string
   aeqecho $s #1
   aeqecho $s $s #2
   aeqecho "$s $s" #3
   aeqecho "$s $s" "${s} string" #4
   aeqecho "${s}1" $s string #5
   aeqecho "" "" "" #6
   aeqecho "" "$s" $s #7
   aeqecho 1 "${s#$s}1" $((2-1)) #8                     
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9  
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}  

산출:

ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.