এখানে বাশ অন্তর্নির্মিত সম্পর্কে আরও কিছু ভুল বোঝাবুঝি হয় trueএবং আরও স্পষ্টতই , বাশ বন্ধনীগুলির মধ্যে কীভাবে এক্সপ্রেশনগুলি ব্যাখ্যা করে এবং ব্যাখ্যা করে।
কোড miku এর উত্তর একেবারে কিছুই ব্যাশ builtin কি আছে true, না /bin/true, কিংবা অন্য কোন গন্ধ trueকমান্ড। এই ক্ষেত্রে, trueএকটি সহজ অক্ষর স্ট্রিং ছাড়া আর কিছুই হয়, এবং কোন কল trueতন্ন তন্ন পরিবর্তনশীল নিয়োগ দ্বারা, কিংবা শর্তাধীন অভিব্যক্তি মূল্যায়ন দ্বারা, কমান্ড / builtin কখনও প্রণীত হয়।
নিম্নলিখিত কোডটি মিকুর উত্তরের কোডটির সাথে কার্যত অভিন্ন:
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
শুধুমাত্র এখানে পার্থক্য হল যে চার অক্ষর তুলনা করা হচ্ছে 'ওয়াই', 'ই', 'একটি', এবং 'জ' পরিবর্তে 'T' এর 'R', 'U', এবং 'ই'। এটাই. কমান্ড বা বিল্টিন নামক কল করার চেষ্টা করা হয়নি yeah, বাশ টোকেনকে পার্স করার সময় কোনও ধরণের বিশেষ হ্যান্ডলিং চলছে না true। এটি কেবল একটি স্ট্রিং, এবং এটিতে সম্পূর্ণ নির্বিচারে।
আপডেট (2014-02-19): মিকুর উত্তরের লিঙ্কটি অনুসরণ করার পরে, এখন আমি দেখছি যে কিছু বিভ্রান্তি আসছে। মিকুর উত্তরে একক বন্ধনী ব্যবহার করা হয়েছে তবে কোড স্নিপেটটি তিনি সংযুক্ত করেছেন যা বন্ধনী ব্যবহার করে না। এটা শুধু:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
উভয় কোড স্নিপেট একই আচরণ করবে , কিন্তু বন্ধনীগুলি হুডের নীচে কী চলছে তা সম্পূর্ণরূপে পরিবর্তন করে।
প্রতিটি ক্ষেত্রে বাশ কী করছে তা এখানে দেখুন:
বন্ধনী নেই:
- ভেরিয়েবলটিকে
$the_world_is_flatস্ট্রিংয়ে প্রসারিত করুন "true"।
"true"কমান্ড হিসাবে স্ট্রিংকে পার্স করার চেষ্টা করুন ।
trueকমান্ডটি সন্ধান করুন এবং চালনা করুন (কোনও বিল্টিন বা /bin/trueবাশ সংস্করণ অনুসারে)।
trueকমান্ডের প্রস্থান কোডটি (যা সর্বদা 0 থাকে) 0 এর সাথে তুলনা করুন all মনে রাখবেন যে বেশিরভাগ শেলগুলিতে 0 এর একটি প্রস্থান কোড সাফল্য এবং অন্য কোনও কিছু ব্যর্থতা নির্দেশ করে।
- যেহেতু প্রস্থান কোড 0 ছিল (সাফল্য), তাই
ifবিবৃতিটির thenধারাটি কার্যকর করুন
বন্ধনী:
- ভেরিয়েবলটিকে
$the_world_is_flatস্ট্রিংয়ে প্রসারিত করুন "true"।
- এখন সম্পূর্ণ-প্রসারিত শর্তসাপেক্ষ অভিব্যক্তিটি পার্স করুন, যা রূপটি
string1 = string2। =অপারেটর ব্যাশ কারো নির্দেশ চলে না স্ট্রিং তুলনা অপারেটর। তাই ...
- উপর একটি স্ট্রিং তুলনা করবেন না
"true"এবং "true"।
- হ্যাঁ, দুটি স্ট্রিং একই ছিল, সুতরাং শর্তাধীন মানটি সত্য।
- সম্পাদন
ifবিবৃতি এর thenদফা।
নো-ব্রেকেট কোড কাজ করে, কারণ trueকমান্ডটি 0-র একটি প্রস্থান কোড ফেরৎ দেয় যা সাফল্যকে নির্দেশ করে। বন্ধনীযুক্ত কোডটি কাজ করে, কারণ এর ডানদিকে $the_world_is_flatস্ট্রিং আক্ষরিকের সমান ।true=
কেবল পয়েন্টটি হোম চালনা করতে, নিম্নলিখিত কোডের দুটি স্নিপেট বিবেচনা করুন:
এই কোডটি (যদি রুট সুবিধাগুলি দিয়ে চালিত হয়) আপনার কম্পিউটারটিকে পুনরায় চালু করবে:
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
এই কোডটি কেবল "দুর্দান্ত চেষ্টা" প্রিন্ট করে। রিবুট কমান্ড কল করা হয় না।
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
আপডেট (২০১৪-০৪-১৪)= এবং ==: এএফআইকে-র মধ্যে পার্থক্য সম্পর্কিত মন্তব্যে প্রশ্নের উত্তর দেওয়ার জন্য , কোনও পার্থক্য নেই। ==অপারেটর একটি ব্যাশ-নির্দিষ্ট সমার্থক হয় =, এবং যতদূর আমি দেখেছি, সব তারা প্রেক্ষিতে ঠিক একই কাজ করে।
উল্লেখ্য, আমি বিশেষভাবে বিষয়ে কথা বলছি =এবং ==পারেন ব্যবহৃত স্ট্রিং তুলনা অপারেটরদের [ ]বা [[ ]]পরীক্ষা। আমি এটি প্রস্তাব দিচ্ছি না =এবং ==ব্যাশের যে কোনও জায়গায় বিনিময়যোগ্য ।
উদাহরণস্বরূপ, আপনি স্পষ্টতই এর সাথে ভেরিয়েবল অ্যাসাইনমেন্ট করতে পারবেন না ==, যেমন var=="foo"(ভাল প্রযুক্তিগতভাবে আপনি এটি করতে পারেন, তবে এর মান varহবে "=foo", কারণ বাশ ==এখানে কোনও অপারেটর দেখছেন না , এটি একটি =(অ্যাসাইনমেন্ট) অপারেটর দেখছেন , তার পরে রয়েছে) আক্ষরিক মান ="foo", যা কেবল হয়ে যায় "=foo")।
এছাড়াও, যদিও =এবং ==বিনিমেয়, আপনি মনের মধ্যে যে রাখা কিভাবে এই পরীক্ষায় কাজ করা উচিত না কিনা এটা ভিতরে ব্যবহার করছেন উপর নির্ভর করে [ ]বা [[ ]], এবং এছাড়াও উপর থাকুক বা না থাকুক operands উদ্ধৃত করা হয়। আপনি যে সম্বন্ধে আরও পড়তে পারেন মধ্যে উন্নত ব্যাশ স্ক্রিপ্টিং গাইড: 7.3 অন্যান্য তুলনা অপারেটর (আলোচনা নিচে স্ক্রোল করুন =এবং ==)।
trueএবংfalseসবচেয়ে স্নিপেট প্রেক্ষাপটে নিচে শুধু সাধারণ স্ট্রিং হয় নাbash built-ins!!! নীচে মাইক হল্ট এর উত্তর পড়ুন। (এটি একটি উদাহরণ যেখানে সর্বাধিক ভোটগ্রহণ ও গৃহীত উত্তর হ'ল আইএমএইচও বিভ্রান্তিকর এবং স্বল্প ভোটের উত্তরে অন্তর্দৃষ্টিপূর্ণ বিষয়বস্তুর ছায়া দেওয়া)