[[[$ A == z *]] এবং [$ a == জেড *] এর মধ্যে পার্থক্য কী?


35

এই দুটি মধ্যে কোন পার্থক্য আছে কি।

[[ $a == z* ]]

এবং

[ $a == z* ] 

আমি কী তাদের উদাহরণ দিতে পারি যেখানে তাদের আলাদা আউটপুট থাকবে?

তদ্ব্যতীত, কাজ কিভাবে [[ ]]পৃথক হয় [ ]?

উত্তর:


41

মধ্যে পার্থক্য [[ … ]]এবং [ … ]বেশিরভাগই মধ্যে আবৃত করা হয় ব্যাশ - একক বা ডবল বন্ধনী ব্যবহার । গুরুতরভাবে, [[ … ]]এটি একটি বিশেষ বাক্য গঠন, যেখানে [একটি কমান্ডের জন্য মজার চেহারা। [[ … ]]ভিতরে যা আছে তার জন্য বিশেষ সিনট্যাক্স বিধি রয়েছে [ … ]

ওয়াইল্ডকার্ডের যুক্ত রিঙ্কেলের সাথে, এখানে কীভাবে [[ $a == z* ]]মূল্যায়ন করা হয় তা এখানে :

  1. কমান্ডটি পার্স করুন: [[ … ]]এটি শর্তসাপেক্ষ প্রকাশের চারপাশে শর্তযুক্ত গঠন $a == z*
  2. শর্তসাপেক্ষ প্রকাশটি পার্স করুন: ==এটি অপারেশনগুলি সহ $aএবং বাইনারি অপারেটর z*
  3. ভেরিয়েবলের মানতে প্রথম অপারেন্ডটি প্রসারিত করুন a
  4. ==অপারেটরের মূল্যায়ন করুন : ভেরিয়েবলের মান aপ্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করুন z*
  5. শর্তসাপেক্ষ এক্সপ্রেশন মূল্যায়ন করুন: এর ফলাফল শর্তসাপেক্ষ অপারেটরের ফলাফল।
  6. কমান্ডটি এখন মূল্যায়ন করা হয়েছে, শর্তসাপেক্ষ প্রকাশটি যদি সত্য হয় তবে এর স্থিতি 0 হয় এবং যদি এটি ভুল হয়।

এখানে [ $a == z* ]মূল্যায়ন হয় কিভাবে :

  1. কমান্ড পার্স: এই হল [আর্গুমেন্ট শব্দ মূল্যায়নের দ্বারা গঠিত সঙ্গে কমান্ড $a, ==, z*, ]
  2. $aভেরিয়েবলের মান প্রসারিত করুন a
  3. কমান্ডের পরামিতিগুলিতে শব্দ বিভাজন এবং ফাইলের নাম তৈরি করুন।
    • উদাহরণস্বরূপ, যদি এর মান a6-চরিত্র স্ট্রিং foo b*(যেমন দ্বারা প্রাপ্ত a='foo b*') এবং বর্তমান ডিরেক্টরী হয় (ফাইল তালিকায় bar, baz, qux, zim, zum), তারপর সম্প্রসারণের ফলাফলের শব্দের নিম্নলিখিত তালিকা হল: [, foo, bar, baz, ==, zim, zum, ]
  4. [পূর্ববর্তী পদক্ষেপে প্রাপ্ত পরামিতিগুলি দিয়ে কমান্ডটি চালান ।
    • উপরের উদাহরণের মানগুলির সাথে, [কমান্ডটি একটি সিনট্যাক্স ত্রুটির অভিযোগ করে এবং স্থিতি 2 প্রদান করে।

দ্রষ্টব্য: [[ $a == z* ]]৩ য় ধাপে, aশব্দের বিভাজন এবং ফাইলের নাম উত্পাদন করা যায় না, কারণ এটি এমন একটি প্রসঙ্গে যেখানে একক শব্দের প্রত্যাশা থাকে (শর্তসাপেক্ষ অপারেটরের বাম হাতের যুক্তি ==)। বেশিরভাগ ক্ষেত্রে, যদি কোনও শব্দটি সেই অবস্থানটিতে অনুধাবন করে তবে পরিবর্তনশীল সম্প্রসারণটি ডাবল উক্তিগুলির মতো আচরণ করে। তবে, এই নিয়মের ব্যতিক্রম আছে: ইন [[ abc == $a ]], যদি এর aওয়াইল্ডকার্ডের মান থাকে তবে aওয়াইল্ডকার্ড প্যাটার্নের সাথে মিলে যায়। উদাহরণস্বরূপ, যদি এর মান aহয় a*তারপর [[ abc == $a ]]সত্য (কারণ ওয়াইল্ডকার্ড *এর unquoted সম্প্রসারণ থেকে আসছে $aম্যাচ *) যেহেতু [[ abc == "$a" ]]মিথ্যা (কারণ সাধারণ চরিত্র*এর উদ্ধৃত বিস্তৃতি থেকে $aমিলছে না bc)। ইনসাইড [[ … ]], ডবল কোট একটি পার্থক্য করতে না, স্ট্রিং ম্যাচিং অপারেটরদের ডান-দিকে ব্যতীত ( =, ==, !=এবং =~)।


39

[testকমান্ডের জন্য একটি উপাধি । ইউনিক্স সংস্করণ an-এর একটি ifকমান্ড ছিল , তবে সংস্করণ ((1979) নতুন বোর্ন শেলটি নিয়ে এসেছিল যার সাথে কয়েকটি প্রোগ্রামিং কনস্ট্রাক্ট রয়েছে যদি-অন্য-এলিফ-ফাই নির্মাণ, এবং ইউনিক্স সংস্করণ 7 একটি testকমান্ড যুক্ত করেছিল যা বেশিরভাগ সম্পাদন করে ifপুরানো সংস্করণগুলিতে কমান্ড দ্বারা পরিচালিত "পরীক্ষা" ।

[এর একটি উপাধি testতৈরি করা হয়েছিল এবং উভয়ই ইউনিক্স সিস্টেম III (1981) এ শেলের সাথে নির্মিত হয়েছিল । যদিও এটি লক্ষ করা উচিত যে কিছু ইউনিক্স বৈকল্পিকের [পরে কমান্ড ছিল না তার পরে ( কিছু বিএসডি-তে যেখানে প্রায় 2000sh সাল পর্যন্ত অ্যালামকুইস্ট শেলের উপর ভিত্তি করে নির্মিত হয়েছিল (একটি testবিল্টিন সর্বদা ashএর উত্সে অন্তর্ভুক্ত ছিল , তবে তাদের উপর বিএসডিগুলি এটি প্রথমে অক্ষম করা হয়েছিল))।

নোট করুন যে testওরফে [একটি "পরীক্ষা" করার আদেশ, এটি কোনও আদেশ নেই যা কমান্ডটি করে, সুতরাং একটি অ্যাসাইনমেন্ট এবং সমতা অপারেটরের মধ্যে বিভক্ত হওয়ার কোনও কারণ নেই, সুতরাং সাম্যতা অপারেটর ===কেবলমাত্র কয়েকটি সাম্প্রতিক বাস্তবায়নের দ্বারা সমর্থিত [(এবং এটির জন্য কেবলমাত্র একটি নাম =)।

কারণ [একটি আদেশ ছাড়া আর কিছুই নয়, এটি শেল দ্বারা অন্য কোনও কমান্ডের মতো একইভাবে পার্স করা হয়।

বিশেষত, আপনার উদাহরণে, $aকারণ এটি উদ্ধৃত হয়নি, শব্দের বিভাজনের স্বাভাবিক নিয়ম অনুসারে কয়েকটি শব্দের মধ্যে বিভক্ত হবে এবং প্রতিটি শব্দই ফাইলনেম জেনারেশন ওরফে গ্লোব্বিংয়ের মধ্য দিয়ে সম্ভবত আরও শব্দের ফলস্বরূপ থাকবে, যার প্রতিটি শব্দই ফলস্বরূপ [কমান্ডের জন্য পৃথক যুক্তি ।

একইভাবে, z*বর্তমান ডিরেক্টরিতে ফাইল নামগুলির তালিকাতে প্রসারিত হবে z

সুতরাং উদাহরণস্বরূপ, যদি $aহয় b* = x, এবং আছে z1, z2, b1এবং b2বর্তমান ডিরেক্টরির মধ্যে ফাইল, [কমান্ড 9 আর্গুমেন্ট পেতে হবে: [, b1, b2, =, x, ==, z1, z2এবং ]

[শর্তযুক্ত অভিব্যক্তি হিসাবে এর যুক্তিগুলি পার্স করে। এই 9 টি যুক্তি বৈধ শর্তযুক্ত অভিব্যক্তিটি যোগ করে না, সুতরাং এটি সম্ভবত একটি ত্রুটি ফিরে আসবে।

[[ ... ]]কনস্ট্রাক্ট Korn থেকে শেল প্রবর্তন করেন সম্ভবত প্রায় 1988 যেমন ksh86a1987 সালে এটা ছিল না যখন ksh88এটা শুরু থেকে ছিল।

Ksh এর পাশ (সমস্ত বাস্তবায়ন), [[...]]এছাড়াও বাশ (যেহেতু ২.০২ সংস্করণ) এবং zsh দ্বারা সমর্থিত, তবে তিনটি বাস্তবায়ন আলাদা এবং একই শেলের প্রতিটি সংস্করণের মধ্যে পার্থক্য রয়েছে যদিও পরিবর্তনগুলি সাধারণত পশ্চাদপটে সামঞ্জস্যপূর্ণ (উল্লেখযোগ্য ব্যতিক্রম বাশের হ'ল =~অপারেটর যা তার আচরণ পরিবর্তন হওয়ার সাথে সাথে একটি নির্দিষ্ট সংস্করণের পরে কয়েকটি স্ক্রিপ্ট ভাঙ্গতে পরিচিত। [[...]]পসিক্স, বা ইউনিক্স বা লিনাক্স (এলএসবি) দ্বারা নির্দিষ্ট করা হয়নি। এটি কয়েকবার অন্তর্ভুক্তির জন্য বিবেচিত হয়েছে, তবে প্রধান শেলগুলি দ্বারা সমর্থিত এর সাধারণ কার্যকারিতা ইতিমধ্যে [কমান্ড এবং case-in-esacকনস্ট্রাক্ট দ্বারা আচ্ছাদিত রয়েছে বলে অন্তর্ভুক্ত করা হয়নি ।

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

[[ ... ]]==শুরু থেকে সম্পর্কে জানতে এবং =1 এর সমতুল্য । Ksh এর যদিও একটি ভুল (এবং বিভ্রান্তি সৃষ্টি করছে এবং অনেকগুলি বাগ সৃষ্টি করছে) তা হ'ল =এবং ==এটি কোনও সমতা অপারেটর নয় বরং একটি প্যাটার্ন ম্যাচিং অপারেটর (যদিও মিলের দিকটি শব্দের সাথে শেল থেকে পৃথক হওয়া অস্পষ্ট নিয়মের সাহায্যে অক্ষম করা যেতে পারে)।

উপরের আপনার কোডে [[ $a == z* ]], শেলটি পার্স করবে যেগুলি নিয়মিত নিয়মের মতো কয়েকটি টোকনে বিভক্ত হয়, একে প্যাটার্নের সাথে মিলের তুলনা হিসাবে স্বীকৃতি দেয়, ভেরিয়েবলের z*সামগ্রীর সাথে মিলের জন্য একটি প্যাটার্ন হিসাবে বিবেচনা করে a

সাধারণত কমান্ডের [[ ... ]]চেয়ে পায়ে নিজেকে গুলি করা শক্ত [। তবে কয়েকটি বিধি পছন্দ করে

  • সর্বদা উদ্ধৃতি ভেরিয়েবল
  • কখনও -aবা -oঅপারেটর ব্যবহার করবেন না (বেশ কয়েকটি [কমান্ড &&এবং || শেল অপারেটর ব্যবহার করুন)

[POSIX শেল দিয়ে নির্ভরযোগ্য করুন ।

[[...]]বিভিন্ন শেলগুলিতে অতিরিক্ত অপারেটরদের সমর্থন করে যেমন -ntরিজেপএক্স ম্যাচিং অপারেটরগুলি ... তবে তালিকা এবং আচরণটি শেল থেকে শেল এবং সংস্করণে সংস্করণে পরিবর্তিত হয়।

সুতরাং আপনার স্ক্রিপ্টটি এর দ্বারা কোন শেল এবং ন্যূনতম সংস্করণটি ব্যাখ্যা করা হবে তা না জানলে এটি সম্ভবত স্ট্যান্ডার্ড [কমান্ডের সাথে থাকা আরও নিরাপদ ।


1 একটি ব্যতিক্রম: [[...]]সংস্করণে ব্যাশে যুক্ত হয়েছিল 2.022.03যেখানেই এটি পরিবর্তন করা হয়েছিল ততক্ষণ [[ x = '?' ]]সত্য হিসাবে [[ x == '?' ]]ফিরে আসবে এবং মিথ্যা ফিরে আসবে। এই উদ্ধৃতিটি হ'ল =এই সংস্করণগুলিতে অপারেটরটি ব্যবহার করার সময় প্যাটার্ন মেলানো বাধা দেয় না , তবে ব্যবহারের সময় করেছিল ==


দুর্দান্ত তথ্য। আপনি দয়া করে ব্যাখ্যা করবেন কেন "কখনই -a বা -o অপারেটর ব্যবহার করবেন না"?
গ্রেবনেকে

@grebneke, চেষ্টা [ '!' = foo -o a = a ]মধ্যে bashউদাহরণস্বরূপ।
স্টাফেন চেজেলাস

0

উভয়ই এক্সপ্রেশন মূল্যায়নের জন্য ব্যবহৃত হয় এবং [[পসিক্স পুরানো বোর্ন শেলটির সাথে কাজ করবে না এবং [[এছাড়াও প্যাটার্ন মেলানো এবং রেজেক্স সমর্থন করে)। উদাহরণস্বরূপ এই চেষ্টা করুন

[ $n -eq 0 -a $y -eq 0 ] && echo "Error" || echo "Ok"

[[ $n -eq 0 && $y -eq 0 ]] && echo "Error" || echo "Ok"


মনে রাখবেন যে বোর্ন শেলটি [[...]]পসিক্স নয়, কিছু শেলের কয়েকটি সংস্করণে কেবল রেগেক্সপ্সকে সমর্থন করে , যেমন কয়েকটি সংস্করণ ডু রিজেক্সপ ম্যাচিংয়ের সমর্থন করে [। পাটিগণিত তুলনার জন্য, সেই শেলগুলিতে সমর্থন করে [[, আপনি বরং লিখতে চান(( n == 0 && y == 0))
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.