एक और तरीका है उन्हें नकारना:
: ${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
। यदि इसका मूल शैल अभी भी मौजूद है, तो परीक्षण पास हो गया है, और यह अगले परीक्षण करता है यदि आपके 'काकाडू ...' स्ट्रिंग को -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 या अधिक तर्क प्रदान करते हैं तो यह सभी को तार के रूप में मानेगा और 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