স্ট্রিং তুলনা জন্য সমান অপারেটর ব্যবহার


117

আমি PHONE_TYPEভেরিয়েবলটিতে তিনটি বৈধ মান রয়েছে কিনা তা পরীক্ষা করে দেখার চেষ্টা করেছি ।

if [ "$PHONE_TYPE" != "NORTEL" ] || [ "$PHONE_TYPE" != "NEC" ] ||
   [ "$PHONE_TYPE" != "CISCO" ]
then
    echo "Phone type must be nortel,cisco or nec"
    exit
fi

উপরের কোডটি আমার পক্ষে কাজ করে নি, তাই আমি পরিবর্তে এটি চেষ্টা করেছি:

if [ "$PHONE_TYPE" == "NORTEL" ] || [ "$PHONE_TYPE" == "NEC" ] ||
   [ "$PHONE_TYPE" == "CISCO" ]
then
    :        # do nothing
else
    echo "Phone type must be nortel,cisco or nec"
    exit
fi

এই ধরণের কাজের জন্য কি আরও পরিষ্কার উপায় আছে?

উত্তর:


162

আমার ধারণা আপনি খুঁজছেন:

if [ "$PHONE_TYPE" != "NORTEL" ] && [ "$PHONE_TYPE" != "NEC" ] &&
   [ "$PHONE_TYPE" != "CISCO" ]

এই সমপরিমাণের নিয়মগুলিকে ডি মরগানের আইন বলা হয় এবং আপনার ক্ষেত্রে এটি বোঝানো হয়:

not(A || B || C) => not(A) && not(B) && not (C)

বুলিয়ান অপারেটর বা এবং এর পরিবর্তন নোট করুন।

যেখানে আপনি চেষ্টা করেছেন:

not(A || B || C) => not(A) || not(B) || not(C)

যা স্পষ্টতই কাজ করে না।


28

খুব ছোট উপায় হ'ল:

if [[ ! $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO)$ ]]; then 
  echo "Phone type must be nortel, cisco or nec."
fi
  • ^ - লাইনের শুরুতে একটি শুরুর সাথে মেলে
  • $ - লাইনের শেষের সাথে মেলে
  • =~ - বাশের অন্তর্নির্মিত নিয়মিত অভিব্যক্তি তুলনা অপারেটর

2
আমি মনে করি এটি হওয়া উচিতif [[ ! $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO)$ ]]; then
মিলান সিমেক

12

ভাল উত্তর, এবং একটি অমূল্য পাঠ;) কেবল একটি নোট দিয়ে পরিপূরক করতে চান।

কোনটি কোন পরীক্ষার জন্য বেছে নিতে পারে তা কোড, কাঠামো, পারিপার্শ্বিকতা ইত্যাদির উপর নির্ভর করে highly

বিকল্প caseহিসাবে নিম্নলিখিত হিসাবে একটি স্যুইচ বা বিবৃতি ব্যবহার করা যেতে পারে :

case "$PHONE_TYPE" in
"NORTEL"|"NEC"|"CISCO")
    echo "OK"
    ;;
*)
    echo "Phone type must be nortel,cisco or nec"
    ;;
esac

দ্বিতীয় নোট হিসাবে আপনার বড় হাতের অক্ষরের নাম ব্যবহার করে যত্নবান হওয়া উচিত। এটি হ'ল সিস্টেম দ্বারা প্রবর্তিত ভেরিয়েবলগুলির মধ্যে সংঘর্ষ রোধ করা, যা প্রায়শই সবসময় উচ্চতর ক্ষেত্রে থাকে। এভাবে $phone_typeপরিবর্তে $PHONE_TYPE

যদিও এটি নিরাপদ তবে আপনার যদি সমস্ত বড় হাতের অক্ষর ব্যবহার করার অভ্যাস থাকে তবে একদিন আপনি হয়ত বলতে পারেন IFS="boo"এবং আপনি আঘাতের জগতে রয়েছেন।

এটি কোনটি স্পট করা সহজ করবে।

নেই একটি আছে কিন্তু একটি জোরালোভাবে বিবেচনা করবে।


এটি সম্ভবত কোনও ফাংশনের জন্য ভাল প্রার্থী। এটি বেশিরভাগই কোডটি পড়া এবং বজায় রাখা সহজ করে তোলে। উদাহরণ:

valid_phone_type()
{
    case "$1" in
    "NORTEL"|"NEC")
        return 0;;
    *)
        echo "Model $1 is not supported"
        return 1;;
    esac
}

if ! valid_phone_type "$phone_type"; then
    echo "Bye."
    exit 1
fi

9

আপনার ওআরএস ব্যবহার করা উচিত, ওআরএস নয়।

if [ "$PHONE_TYPE" != "NORTEL" ] && [ "$PHONE_TYPE" != "NEC" ] && [ "$PHONE_TYPE" != "CISCO" ]
then

অথবা

if [ "$PHONE_TYPE" != "NORTEL" -a "$PHONE_TYPE" != "NEC" -a "$PHONE_TYPE" != "CISCO" ]
then

1

উপরের উত্তরটি সংশোধন করতে (যেমন আমি এখনও মন্তব্য করতে পারি না):

PHONE_TYPE="NORTEL"
if [[ $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO|SPACE TEL)$ ]]; then 
  echo "Phone type accepted."
else
  echo "Error! Phone type must be NORTEL, CISCO or NEC."
fi

দয়া করে মনে রাখবেন যে = = of এর ব্যবহারের জন্য আপনার কমপক্ষে কমপক্ষে ব্যাশ 4 প্রয়োজন ~
এটি ব্যাশ 3 তে কাজ করে না।

আমি এমএস উইন্ডোজ 7 এ ব্যাশ 4.3.46 (ভাল কাজ করে) এবং ব্যাশ 3.1.17 ব্যবহার করে পরীক্ষা করেছি (কাজ হয়নি)

= Of এর এলএইচএসের উদ্ধৃতি হওয়া উচিত। উপরে, PHONE_TYPE = "স্পেস টেল" খুব মিলবে।


0

[[পরিবর্তে পরিবর্তে) ব্যবহার করুন

if [[ "$PHONE_TYPE" != "NORTEL" ]] || [[ "$PHONE_TYPE" != "NEC" ]] || 
   [[ "$PHONE_TYPE" != "CISCO" ]]
then
echo "Phone type must be nortel,cisco or nec"
exit 1
fi

2
এটি অবশ্যই ভুল। [[বনাম [যুক্তি বন্ধ হওয়ার সাথে সহায়তা করে না।
ইলকচাচু

0

@ 0x80 সমাধানের ভিত্তিতে একটি পরিবর্তনের প্রস্তাব:

# define phone brand list
phoneBrandList=" NORTEL NEC CISCO" ## separator is space with an extra space in first place

# test if user given phone is contained in the list
if [[ ${phoneBrandList} =~ (^|[[:space:]])"${userPhoneBrand}"($|[[:space:]]) ]]; then
    echo "found it !"
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.