답변:
-eq
산술 연산자로 두 숫자를 비교합니다.
사용 =
(휴대용 / 표준 sh
), =~
또는 ==
대신.
${PACKAGENAME}
공백이나 와일드 카드 문자 가 포함되어 있으면 여러 인수로 분할 [
되므로 원하는 것보다 많은 인수를 볼 수 있으므로 따옴표도 사용 하십시오. 일반적인 bash 함정 목록을 참조 하십시오 .
if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
echo "successfully entered if block!!"
fi
에 대한 man bash
검색 ( /)을 참조하십시오 CONDITIONAL EXPRESSIONS
.
polym
합니다. 리소스를 찾아 주셔서 감사합니다. VI 가이드 옆에있는 탭을 엽니 다. :)
[[ $PACKAGENAME == "kakadu..." ]]
괜찮습니다.
=
, ==
그리고 !=
그 측면이 패턴이 아닌 문자열이기 때문에. 예를 들어, foo='*'; [[ whatever = $foo ]]
사실입니다.
if 블록이 다음 -eq
과 ==
같이되도록 교체하십시오 .
if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
또 다른 방법은 그들을 부정하는 것입니다.
: ${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
-eq
정수의 경우 문자열 또는 정규식 (==
또는=~
) 을 테스트하려고합니다 . mywiki.wooledge.org/BashGuide/TestsAndConditionals