আনসেট বনাম ব্যবহার করে। একটি ভেরিয়েবলকে ফাঁকাতে সেট করে


108

আমি বর্তমানে বাশ পরীক্ষার কাঠামো লিখছি, যেখানে একটি পরীক্ষার ফাংশনে, উভয় স্ট্যান্ডার্ড বাশ পরীক্ষা ( [[) পাশাপাশি পূর্বনির্ধারিত ম্যাথার ব্যবহার করা যেতে পারে। ম্যাচাররা '[[' এ মুদ্রণযোগ্য এবং কোনও রিটার্ন কোড ফেরত দেওয়ার পাশাপাশি, কী প্রত্যাশা করা হয়েছিল তা বোঝাতে কিছু অর্থপূর্ণ বার্তা সেট করে।

উদাহরণ:

string_equals() {
    if [[ ! $1 = $2 ]]; then
            error_message="Expected '$1' to be '$2'."

            return 1
    fi
}

সুতরাং, যখন কোনও ম্যাচার ব্যবহার করা হয় এবং এটি ব্যর্থ হয়, কেবল তখনই একটি ত্রুটি_সীমা সেট করা থাকে।

এখন, এক পর্যায়ে পরে, আমি পরীক্ষাগুলি সফল হয়েছিল কিনা তা পরীক্ষা করি। যদি এটি সফল হয় তবে আমি প্রত্যাশাটি সবুজ রঙে মুদ্রণ করি, যদি এটি লাল ব্যর্থ হয়।

তদ্ব্যতীত, এখানে একটি ত্রুটি_ম্যাসেজ সেট থাকতে পারে, তাই আমি পরীক্ষা করি যে কোনও বার্তা উপস্থিত থাকলে, এটি মুদ্রণ করুন এবং তারপরে সেটটি সেট না করে (কারণ নিম্নলিখিত পরীক্ষাগুলি সেট নাও করতে পারে error_message):

if [[ $error_message ]]; then
    printf '%s\n' "$error_message"

    unset -v error_message
fi

এখন আমার প্রশ্ন হ'ল যদি ভেরিয়েবলটি আনসেট করা ভাল হয় বা কেবল এটি পছন্দ করে '' তে সেট করা যায়

error_message=''

কোনটা ভালো? এটি কি আসলেই কোনও পার্থক্য করে? বা সম্ভবত আমার একটি অতিরিক্ত পতাকা লাগানো উচিত যা ইঙ্গিত করে যে বার্তাটি সেট করা হয়েছিল?


1
আপনি যদি কখনও error_messageঅন্য কোনও কিছুর সাথে তুলনা করেন না, আমি বলব এটির কোনও গুরুত্ব নেই। তবে, আমি মনে করি আপনি চান [[ $error_message ]], অন্যথায় আপনি পরীক্ষা করছেন যে আক্ষরিক স্ট্রিং "ত্রুটি_মেসেজ" বিদ্যমান আছে exists
চ্যানার

@ চেপনার হ্যাঁ, টাইপো ছিল ঠিক কর.
হেল্পারমেডো

উত্তর:


143

আপনি ব্যবহার না করা পর্যন্ত বেশিরভাগই আপনি কোনও পার্থক্য দেখতে পাবেন না set -u:

/home/user1> var=""
/home/user1> echo $var

/home/user1> set -u
/home/user1> echo $var

/home/user1> unset var
/home/user1> echo $var
-bash: var: unbound variable

সুতরাং সত্যিই, এটি নির্ভর করে আপনি কীভাবে চলকটি পরীক্ষা করতে যাচ্ছেন।

এটি যুক্ত করা থাকলে আমি পরীক্ষার আমার পছন্দের উপায়টি যুক্ত করব:

[[ -n $var ]]  # True if the length of $var is non-zero

অথবা

[[ -z $var ]]  # True if zero length

43
var="সেট করা নেই" নয়। এটি কেবল একটি অব্যক্ত ফাঁকা স্ট্রিং। এছাড়াও set -u, বাশের বিভিন্ন আকারের প্যারামিটার বিস্তৃতি আনসেট এবং নাল মানগুলির মধ্যে পার্থক্য করতে পারে: আনসেট না থাকলে ${foo:bar}"বার" এ প্রসারিত হয় foo, তবে " নু" থাকে foo, যখন ${foo:-bar}foo আনসেট বা নাল থাকে তবে "বার" এ প্রসারিত হয়।
চ্যানার

1
[[ -n $var ]]যদি varখালি স্ট্রিংতে সেট করা থাকে তবে এটি মিথ্যা ।
চ্যানার

1
আপনি যদি ভেরিয়েবলের 'অস্তিত্ব' পরীক্ষা করতে 'ডিক্লেয়ার-পি' ব্যবহার করেন তবে var = দেখিয়ে দেবে 'ঘোষণা - বর্ণ = ""' আপনাকে এটিকে পরিত্রাণ পেতে অবশ্যই আনসেট ব্যবহার করতে হবে, অবশ্যই যদি এটি একটি পঠনযোগ্য পরিবর্তনশীল হয় তবে আপনি এটি পেতে পারেন না অবশ্যই এটি পরিত্রাণ। তদুপরি, যদি আপনি কোনও ফাংশনের অভ্যন্তরে কিছু = var, আপনি "স্থানীয় var = মান" ব্যবহার করেন তবে এ থেকে পরিত্রাণের বিষয়ে চিন্তা করতে হবে না তবে সতর্কতা অবলম্বন করুন, কারণ "ঘোষিত ভার = মান" স্থানীয়ও রয়েছে declare ঘোষণার ক্ষেত্রে আপনাকে "স্পষ্টতই" ঘোষিত -g var = মান "ব্যবহার করে বিশ্বব্যাপী সেট করতে হবে, ঘোষণা ছাড়াই আপনাকে স্পষ্টতই" স্থানীয় "ব্যবহার করে স্থানীয় হিসাবে সেট করতে হবে lo গ্লোবাল ভারগুলি কেবল মুছে ফেলা / ডাব্লু আনসেট না করে থাকে।
ওসিরিসগোথর

@osirisgothra: স্থানীয় ভেরিয়েবল সম্পর্কে ভাল পয়েন্ট। অবশ্যই সাধারণত কোনও ফাংশনে সমস্ত ভেরিয়েবলগুলি ঘোষিত (বা স্থানীয়করণ) করা ভাল তবে এটি এনক্যাপুলেটেড থাকে।
সিডরেকে

3
@ চেপারের ${foo-bar}পরিবর্তে হওয়া উচিত ${foo:bar}। নিজের জন্য পরীক্ষা:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
লিভিউ চিরচু

17

যেমন বলা হয়েছে, আনসেট ব্যবহার করা অ্যারের সাথেও আলাদা is

$ foo=(4 5 6)

$ foo[2]=

$ echo ${#foo[*]}
3

$ unset foo[2]

$ echo ${#foo[*]}
2

2

সুতরাং, অ্যারে সূচি 2 আনসেট 'না করে আপনি প্রয়োজনীয়ভাবে অ্যারেতে সেই উপাদানটি সরিয়ে ফেলুন এবং অ্যারের আকার (?) হ্রাস করুন।

আমি নিজের পরীক্ষা করে নিলাম ..

foo=(5 6 8)
echo ${#foo[*]}
unset foo
echo ${#foo[*]}

যার ফলাফল ..

3
0

সুতরাং কেবল এটি স্পষ্ট করতে যে পুরো অ্যারেটি আনসেট 'করা আসলে এটি সম্পূর্ণরূপে সরিয়ে ফেলবে।


0

উপরের মন্তব্যের ভিত্তিতে, এখানে একটি সহজ পরীক্ষা:

isunset() { [[ "${!1}" != 'x' ]] && [[ "${!1-x}" == 'x' ]] && echo 1; }
isset()   { [ -z "$(isunset "$1")" ] && echo 1; }

উদাহরণ:

$ unset foo; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's unset
$ foo=     ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set
$ foo=bar  ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.