কোনও শেল স্ক্রিপ্টে ভেরিয়েবল খালি কিনা তা পরীক্ষা করা হচ্ছে


27

ভেরিয়েবলটি খালি রয়েছে কিনা তা পরীক্ষা করতে আমি নীচের কৌশলটি বহুবার বিভিন্ন শেলের উপর বহুবার ব্যবহৃত দেখেছি:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

আরও বেশি বিহ্বলতার মাধ্যমে এটি ব্যবহার করার কোনও সুবিধা আছে কি if [ -z "$1" ]? এটি একটি বহনযোগ্য সমস্যা হতে পারে?

উত্তর:


17

কিছু historicalতিহাসিক শেল একটি খুব সাধারণ পার্সার প্রয়োগ করেছে [ -n = "" ]যা প্রথম =অপারেটরটিকে অপারেটর হিসাবে দেখায় এমন কিছু নিয়ে বিভ্রান্ত হতে পারে এবং এটি পার্স করতে [ -n = ]পারে বা সিনট্যাক্স ত্রুটির কারণ হতে পারে। ইন [ "x$1" = x"" ], xউপসর্গটি নিশ্চিত করে যে x"$1"সম্ভবত অপারেটরের মতো দেখতে পারে না এবং তাই শাইনটি এই পরীক্ষার বিশ্লেষণের একমাত্র উপায় =বাইনারি অপারেটর হিসাবে আচরণ করে ।

সমস্ত আধুনিক শেল এবং এমনকি বেশিরভাগ পুরানো শেলগুলি এখনও চালু রয়েছে, পসিএক্স নিয়ম অনুসরণ করে যা নির্দেশ দেয় যে 4 টি শব্দ পর্যন্ত সমস্ত পরীক্ষার এক্সপ্রেশন সঠিকভাবে পার্স করা উচিত। তাই [ -z "$1" ]পরীক্ষার একটি সঠিক পথ যদি $1খালি , এবং [ "$x" = "$y" ]দুই ভেরিয়েবল সমতা পরীক্ষা করার জন্য একটি সঠিক উপায়।

এমনকি কিছু বর্তমান শেল আর এক্সপ্রেশন সঙ্গে গুলিয়ে ফেলা হতে পারে, এবং কয়েক এক্সপ্রেশন আসলে দ্ব্যর্থক, তাই ব্যবহার এড়িয়ে -aএবং -oআর বুলিয়ান পরীক্ষার গঠন করা, এবং পরিবর্তে পৃথক কল ব্যবহার করতে অপারেটরদের [এবং শেল নিজস্ব &&এবং ||বুলিয়ান অপারেটর।


3
এটি কেবল historical তিহাসিক শাঁসই নয়। কিছু shবাণিজ্যিক ইউনিয়নের উপর ভিত্তি করে কিছু ksh88 ভিত্তিতে এখনও সমস্যাটি রয়েছে। বিশদ জন্য এখানে দেখুন ।
স্টাফেন চেজেলাস

এই বিবৃতিটি ভুল: খালি [ -z "$1" ]থাকলে পরীক্ষার উপযুক্ত উপায়$1sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'- উভয়ই 0 প্রত্যাবর্তন করে তবে দ্বিতীয় ক্ষেত্রে $1খালি থাকতে পারে না কারণ এটি বিদ্যমান নেই।
মাইক্রজারভ


3

আপনি যদি "সেট-ইউ" বা "সেট-ননসেট" দিয়ে চালনা করেন তবে উপরোক্ত পরীক্ষাগুলিও ত্রুটির কারণ হতে পারে

খালি ভেরিয়েবলটি পরীক্ষা করার আরও স্থিতিশীল উপায় হ'ল প্যারামিটার সম্প্রসারণ ব্যবহার করা :

MYVAR = {Y MYVAR: - "খারাপ মান"}

এই পদ্ধতিটি প্রচলিত বোর্ন শেল, পাশাপাশি ksh এবং ব্যাশের জন্য কাজ করে।


2
আমি বিশ্বাস করি এটি হিসাবে লেখা হয়েছে -> এম = $ {এম: - "খারাপ মান"
জ্ঞান

0
    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

3
নমস্কার! আমি নিশ্চিত না যে এটি কীভাবে প্রশ্নটির উত্তর দেয়, কেন জিজ্ঞাসা করে যে= বনাম কেন ব্যবহার করতে হবে -z, এখন কীভাবে।
ধাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.