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