উত্তর:
কিছু historicalতিহাসিক শেল একটি খুব সাধারণ পার্সার প্রয়োগ করেছে [ -n = "" ]
যা প্রথম =
অপারেটরটিকে অপারেটর হিসাবে দেখায় এমন কিছু নিয়ে বিভ্রান্ত হতে পারে এবং এটি পার্স করতে [ -n = ]
পারে বা সিনট্যাক্স ত্রুটির কারণ হতে পারে। ইন [ "x$1" = x"" ]
, x
উপসর্গটি নিশ্চিত করে যে x"$1"
সম্ভবত অপারেটরের মতো দেখতে পারে না এবং তাই শাইনটি এই পরীক্ষার বিশ্লেষণের একমাত্র উপায় =
বাইনারি অপারেটর হিসাবে আচরণ করে ।
সমস্ত আধুনিক শেল এবং এমনকি বেশিরভাগ পুরানো শেলগুলি এখনও চালু রয়েছে, পসিএক্স নিয়ম অনুসরণ করে যা নির্দেশ দেয় যে 4 টি শব্দ পর্যন্ত সমস্ত পরীক্ষার এক্সপ্রেশন সঠিকভাবে পার্স করা উচিত। তাই [ -z "$1" ]
পরীক্ষার একটি সঠিক পথ যদি $1
খালি , এবং [ "$x" = "$y" ]
দুই ভেরিয়েবল সমতা পরীক্ষা করার জন্য একটি সঠিক উপায়।
এমনকি কিছু বর্তমান শেল আর এক্সপ্রেশন সঙ্গে গুলিয়ে ফেলা হতে পারে, এবং কয়েক এক্সপ্রেশন আসলে দ্ব্যর্থক, তাই ব্যবহার এড়িয়ে -a
এবং -o
আর বুলিয়ান পরীক্ষার গঠন করা, এবং পরিবর্তে পৃথক কল ব্যবহার করতে অপারেটরদের [
এবং শেল নিজস্ব &&
এবং ||
বুলিয়ান অপারেটর।
[ -z "$1" ]
থাকলে পরীক্ষার উপযুক্ত উপায়$1
। sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- উভয়ই 0 প্রত্যাবর্তন করে তবে দ্বিতীয় ক্ষেত্রে $1
খালি থাকতে পারে না কারণ এটি বিদ্যমান নেই।
Http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html এর মতে , -z
পরীক্ষা কিছু বাস্তবায়নে অনিরাপদ , সম্ভবত "আকর্ষণীয়" স্ট্রিংগুলির মতো "-o a=a"
পরীক্ষা করা হয়।
আপনি যদি "সেট-ইউ" বা "সেট-ননসেট" দিয়ে চালনা করেন তবে উপরোক্ত পরীক্ষাগুলিও ত্রুটির কারণ হতে পারে
খালি ভেরিয়েবলটি পরীক্ষা করার আরও স্থিতিশীল উপায় হ'ল প্যারামিটার সম্প্রসারণ ব্যবহার করা :
MYVAR = {Y MYVAR: - "খারাপ মান"}
এই পদ্ধতিটি প্রচলিত বোর্ন শেল, পাশাপাশি ksh এবং ব্যাশের জন্য কাজ করে।
function isBlank {
valueNoSpaces=$(echo "$@" | tr -d ' ')
if [ "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ]
then
echo true ;
else
echo "" ;
fi
}
#Test
if [ $(isBlank " ") ]
then
echo "isBlank \" \" : it's blank"
else
echo " isBlank \" \": it is not blank"
fi
if [ $(isBlank "abc") ]
then
echo "isBlank \"abc\" : it's blank"
else
echo "isBlank \"abc\" :it is not blank"
fi
if [ $(isBlank null) ]
then
echo "isBlank null : it's blank"
else
echo "isBlank null : it is not blank"
fi
if [ $(isBlank "") ]
then
echo "isBlank \"\" : it's blank"
else
echo "isBlank \"\" : it is not blank"
fi
#Result
isBlank " " : it's blank
isBlank "abc" :it is not blank
isBlank null : it's blank
isBlank "" : it's blank
=
বনাম কেন ব্যবহার করতে হবে -z
, এখন কীভাবে।
sh
বাণিজ্যিক ইউনিয়নের উপর ভিত্তি করে কিছু ksh88 ভিত্তিতে এখনও সমস্যাটি রয়েছে। বিশদ জন্য এখানে দেখুন ।