Başka bir yol onları olumsuzlamaktır:
: ${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
Yukarıdaki blok ilk önce "$PACKAGENAME"
herhangi bir değeri olup olmadığını test eder , ve eğer değilse hatayla çıkıp eko ?'this'}
yapar stderr
. Ana kabuğu hala mevcutsa test geçmiştir ve daha sonra 'kakadu ...' dizginizi değişkenden çıkardığınızda testler -z
boş bir dizgeyle sonuçlanır . Olmazsa, o zaman tekrar bir hata yayar ve kabuktan çıkar. Kabuğunuz bu noktada blok yürütüldükten sonra da hala mevcutsa, aksi halde değildir.
Muhtemelen bu tür bir şey en iyi şekilde bir fonksiyonda gerçekleştirilir. Sevmek:
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
)
Bu fonksiyonla sisteminizin izin verdiği kadar argüman sağlayabilirsiniz. 2'den az sağlarsanız 1 döndürür ve bir mesaj gönderir stderr
. 2 veya daha fazla argüman sağlarsanız, hepsi dizeler olarak değerlendirilir ve eğer hepsi aynıysa ve null değilse, 0 döndürür, ilk önce kontrolde başarısız olan argüman numarasını döndürür.
Senin durumunda böyle kullanılabilir:
{
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
Daha fazla göstermek için başka bir işlev yazacağım:
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
}
DEMO:
{ 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
}
ÇIKTI:
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
tamsayılar için doğrudur, bir dize veya regex için test etmek istersiniz (==
veya=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionals