বাশে দুটি স্ট্রিং তুলনা করা


22

ifআমার বাশ স্ক্রিপ্টে আমার নিম্নলিখিত ব্লক রয়েছে:

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

স্ক্রিপ্ট এক্সিকিউশনটি সমান ifহলেও আমার ব্লকে প্রবেশ করছে না । আমি কি ভুল করছি?$PACKAGENAMEkakadu-v6_4-00902C


9
-eqপূর্ণসংখ্যার জন্য সত্য, আপনি একটি স্ট্রিং বা রেজেক্সের জন্য পরীক্ষা করতে চান ( ==বা =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
জেসনওয়ারিয়ান

ধন্যবাদ jasonwryanআমি এই সংস্থানটি একবার দেখে নেব!
ডেমিশিপ

উত্তর:


31

-eq একটি গাণিতিক অপারেটর, যা দুটি সংখ্যার তুলনা করে।

ব্যবহারের =(পোর্টেবল / মান sh), =~বা ==পরিবর্তে।

এছাড়াও উদ্ধৃতিগুলি ব্যবহার করুন, কারণ যদি ${PACKAGENAME}কোনও শ্বেতস্পেস বা ওয়াইল্ডকার্ডের অক্ষর থাকে তবে এটি একাধিক যুক্তিতে বিভক্ত হবে, যার ফলে [কাঙ্ক্ষিতের চেয়ে বেশি যুক্তি দেখানো হবে। এখানে সাধারণ ব্যাশের ক্ষতির তালিকা দেখুন ।

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

দেখুন man bash, অনুসন্ধান ( /জন্য) CONDITIONAL EXPRESSIONS


1
আহ! ধন্যবাদ! এটা কাজ করেছে! আমি স্পষ্টতই এটির এক ধোঁয়াশা। আমি আপনার সাহায্যের জন্য কৃতজ্ঞ!
ডেমিশিপ

2
আপনি কি tldp.org/LDP/Bash-Beginners- Guide/html দেখুন ? এটি একটি খুব সুন্দর বাশ গাইড এবং উদাহরণ এবং পরীক্ষায় আপনাকে সহায়তা করবে :)।
পোলিম

1
ধন্যবাদ polymআমি একবার দেখে নেব, রিসোর্সের জন্য ধন্যবাদ! আমি আমার ষষ্ঠ গাইডের পাশে সেই ট্যাবটি খুলব। :)
ডেমিশিপ

4
ডাবল বন্ধনীগুলির মধ্যে কোনও শব্দ বিভাজন হয় না [[ $PACKAGENAME == "kakadu..." ]], ঠিক আছে।
গ্লেন জ্যাকম্যান

4
তবে সাবধান @glennjackman যে এমনকি ডবল বন্ধনী মধ্যে, আপনি ডান দিকে পরিবর্তনশীল প্রসারণও প্রায় ডবল কোট প্রয়োজন =, ==এবং !=, কারণ যে দিকে একটি প্যাটার্ন, না একটি স্ট্রিং। উদাহরণস্বরূপ, foo='*'; [[ whatever = $foo ]]সত্য।
গিলস 'অশুভ হওয়া বন্ধ করুন'

6

প্রতিস্থাপন -eqসঙ্গে == তাই আপনার যদি ব্লক এই হবে: -

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

        echo "successfully entered if block!!"

fi

5
উদ্ধৃতি ভুলবেন না! এখানে দেখুন, কেন: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
পলিম

@ পলিম ওহে ধন্যবাদ, তবে আমি কাজ করে যা ছিল সংক্ষিপ্ত সংস্করণটি দিয়েছি;): ডি।
সূচনা

4

আর একটি উপায় তাদের অবহেলা করা হয়:

: ${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 টি যদি সমস্ত অভিন্ন হয় এবং শূন্য না হয় তবে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.