Bash에서 두 문자열 비교

Bash에서 두 문자열 비교

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

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

if동일 하더라도 $PACKAGENAME스크립트 실행은 내 블록에 들어 가지 않습니다 kakadu-v6_4-00902C. 내가 뭘 잘못했나요?

답변1

-eq두 숫자를 비교하는 데 사용되는 산술 연산자입니다.

=(portable/standard sh) =~또는 대신 사용하세요 ==.

또한 ${PACKAGENAME}공백이나 와일드카드를 포함하면 여러 인수로 분할되어 make가 [필요한 것보다 더 많은 인수를 볼 수 있으므로 따옴표를 사용하십시오. 바라보다여기일반적인 bash 함정 목록입니다.

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

참조 man bash, 검색( /)CONDITIONAL EXPRESSIONS.

답변2

if 블록이 다음과 같이 보이도록 -eq다음으로 바꾸십시오 .==

if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then

        echo "successfully entered if block!!"

fi

답변3

또 다른 방법은 이를 부정하는 것입니다.

: ${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. 2개 이상의 매개변수를 제공하는 경우 모든 매개변수를 문자열로 처리하고 모든 매개변수가 동일하고 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

관련 정보