পূর্ণসংখ্যার তুলনা: পাটিগণিতের প্রকাশ বা শর্তাধীন অভিব্যক্তি


20

বাশ-এ, শর্তযুক্ত অভিব্যক্তি ব্যবহার করে দুটি পূর্ণসংখ্যার তুলনা করা যেতে পারে

আরগ 1 ওপি আরগ 2

ওপি অন্যতম -eq, -ne, -lt, -le, -gt, অথবা -ge। এই পাটিগণিত বাইনারি অপারেটরগুলি যথাক্রমে arg1 এর সমান, সমান না, কম, কম বা সমান, বৃহত্তর, বা বৃহত্তর বা সমান বা সমান হলে সত্যটি ফিরে আসেআরজি 1 এবং আরজি 2 ইতিবাচক বা নেতিবাচক পূর্ণসংখ্যার হতে পারে।

বা পাটিগণিত প্রকাশ:

<= >= < > তুলনা

== != সমতা এবং বৈষম্য

দুটি পূর্ণসংখ্যার তুলনা করার জন্য কেন আমাদের দুটি ভিন্ন উপায় আছে? কখন ব্যবহার করবেন?

উদাহরণস্বরূপ, [[ 3 -lt 2 ]]শর্তসাপেক্ষ এক্সপ্রেশন (( 3 < 2 ))ব্যবহার করে এবং গাণিতিক এক্সপ্রেশন ব্যবহার করে। উভয়ই 0 প্রদান করে যখন তুলনাটি সত্য হয়

দুটি পূর্ণসংখ্যার সাথে তুলনা করার সময়, এই দুটি পদ্ধতিটি কি সর্বদা বিনিময়যোগ্য হিসাবে ব্যবহার করা যেতে পারে? যদি হ্যাঁ, তবে বাশের একটির পরিবর্তে দুটি পদ্ধতি রয়েছে কেন?


1
= != < <= > >=স্ট্রিং তুলনা করুন । 1 -eq 01তবে 1 != 01এবং 8 -lt 42তবে8 > 42
dave_thompson_085

পাটিগণিতের এক্সপ্রেশনগুলিতে এগুলি ওভারলোড হয়।
টিম

1
প্রতিটি বৈশিষ্ট্য কখন যুক্ত করা হয়েছিল তা জানতে আপনাকে ব্যাশ চেঞ্জলগগুলি সন্ধান করতে হবে। আমি সন্দেহ করি পাটিগণিত এক্সপ্রেশন টেস্ট কমান্ডের চেয়ে অনেক পরে যুক্ত হয়েছিল।
গ্লেন জ্যাকম্যান

আমি স্ট্রিং তুলনা সম্পর্কে জিজ্ঞাসা করছি না। @muru।
টিম

উত্তর:


28

হ্যাঁ, দুটি পূর্ণসংখ্যার তুলনা করার আমাদের দুটি ভিন্ন উপায় রয়েছে।

দেখে মনে হচ্ছে এই তথ্যগুলি এই ফোরামে ব্যাপকভাবে গৃহীত নয়:

  1. বাগ্ধারা ইনসাইড [ ]গাণিতিক তুলনা জন্য অপারেটরদের হয় -eq, -ne, -lt, -le, -gtএবং -ge

    যেহেতু তারাও একটি পরীক্ষা কমান্ডের ভিতরে এবং ক এর অভ্যন্তরে [[ ]]

    হ্যাঁ এই বাগধারার ভিতরে, =, <, ইত্যাদি স্ট্রিং অপারেটার হয়।

  2. বাগ্ধারা ইনসাইড (( ))গাণিতিক তুলনা জন্য অপারেটরদের হয় ==, !=, <, <=, >, এবং >=

    না, এটি কোনও "গাণিতিক সম্প্রসারণ" নয় (যা দিয়ে শুরু হয় $) $(( ))। এটি ম্যান ব্যাশে "যৌগিক কমান্ড" হিসাবে সংজ্ঞায়িত হয়েছে।

    হ্যাঁ, এটি "গাণিতিক সম্প্রসারণ" এর একই নিয়মগুলি (অভ্যন্তরীণভাবে) অনুসরণ করে তবে এর কোনও আউটপুট নেই, কেবলমাত্র একটি প্রস্থান মূল্য। এটি এভাবে ব্যবহার করা যেতে পারে:

if (( 2 > 1 )); then ...

দুটি পূর্ণসংখ্যার তুলনা করার জন্য কেন আমাদের দুটি ভিন্ন উপায় আছে?

আমি অনুমান করি যে (( ))আধুনিকটি পাটিগণিত পরীক্ষা করার সহজ উপায় হিসাবে বিকাশিত হয়েছিল। এটি প্রায় একই রকম $(( ))তবে এর কোনও আউটপুট নেই।

দুটো কেন? কেন আমাদের দুটি printf(বহিরাগত এবং বিল্টিন) বা চারটি পরীক্ষা (বাহ্যিক test, অন্তর্নির্মিত test, [এবং [[) কেন ঠিক একই । এইভাবে শাঁসগুলি বেড়ে ওঠে, এক বছরের মধ্যে কিছু অঞ্চল উন্নত করে, পরের বছর আরও কিছু উন্নত করে।

কখন ব্যবহার করবেন?

এটি একটি খুব শক্ত প্রশ্ন কারণ কার্যকর কোনও পার্থক্য থাকতে হবে না। অভ্যন্তরীণভাবে কোনও [ ]কাজ এবং কাজের পথে কিছু পার্থক্য আছে (( ))তবে: দুটি পূর্ণসংখ্যার তুলনা করা ভাল কোনটি? যে কেউ!.

দুটি পূর্ণসংখ্যার সাথে তুলনা করার সময়, এই দুটি পদ্ধতিটি কি সর্বদা বিনিময়যোগ্য হিসাবে ব্যবহার করা যেতে পারে?

দুটি সংখ্যার জন্য আমি হ্যাঁ বলতে বাধ্য।
তবে ভেরিয়েবল, বিস্তৃতি, গাণিতিক ক্রিয়াকলাপগুলির জন্য মূল পার্থক্য থাকতে পারে যা একে অপরের পক্ষে হওয়া উচিত। আমি বলতে পারি না যে একেবারে উভয়ই সমান। একটির জন্য, (( ))ক্রমানুসারে কয়েকটি গণিত ক্রিয়াকলাপ সম্পাদন করতে পারে:

if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi

যদি হ্যাঁ, তবে বাশের একটির পরিবর্তে দুটি পদ্ধতি রয়েছে কেন?

যদি উভয়ই সহায়ক হয় তবে কেন ?.


1
=একটি অ্যাসাইনমেন্ট এবং ==এটি পাটিগণিতের বিস্তারের তুলনা। প্রশ্নটি এটিকে সঠিকভাবে উদ্ধৃত করে। তবে উত্তরটি ভুল।

12

.তিহাসিকভাবে, testকমান্ডটি প্রথমে বিদ্যমান ছিল (কমপক্ষে ১৯৯৯ সালে ইউনিক্স সপ্তম সংস্করণে ফিরে আসা )। এটা তোলে অপারেটর ব্যবহার করা =এবং !=স্ট্রিং তুলনা, এবং -eq, -ne, -lt, ইত্যাদি নম্বর মিলাতে। উদাহরণস্বরূপ, test 0 = 00মিথ্যা, তবে test 0 -eq 00সত্য। আমি জানি না কেন এই সিনট্যাক্সটি বেছে নেওয়া হয়েছিল, তবে এটি ব্যবহার এড়ানো <এবং >এই শেলটি পুনঃনির্দেশ অপারেটর হিসাবে পার্স করে থাকতে পারে। testকমান্ড কয়েক বছর পরে অন্য সিনট্যাক্স করেছেন: [ … ]সমতূল্য test …

[[ … ]]শর্তাধীন বাক্য গঠন, যা ভিতরে <এবং >মূল্য উদ্ধৃতি ছাড়া অপারেটার হিসেবে ব্যবহার করা যাবে, পরে ksh যোগ করা হয়েছিল। এটি পিছনে সামঞ্জস্য রেখেছিল [ … ], সুতরাং এটি একই অপারেটর ব্যবহার করে তবে যুক্ত করে <এবং >স্ট্রিংগুলির তুলনা করতে (উদাহরণস্বরূপ, [[ 9 > 10 ]]তবে [[ 9 -lt 10 ]])। আরও তথ্যের জন্য দেখুন একক বা ডাবল বন্ধনী - ব্যাশ ব্যবহার করুন

পাটিগণিতের প্রকাশগুলিও testকমান্ডের চেয়ে পরে 1980 এর দশকের একসময় কর্ন শেলের মধ্যে এসেছিল । তারা সি ভাষার বাক্য গঠনটি অনুসরণ করেছিল যা ইউনিক্স চেনাশোনাগুলিতে খুব জনপ্রিয় ছিল। সুতরাং তারা সি'র অপারেটরগুলি ব্যবহার করত: ==সাম্যতার <=জন্য, কম-বা সমান ইত্যাদির জন্য etc.

ইউনিক্স সপ্তম সংস্করণে পাটিগণিতের অভিব্যক্তি ছিল না, তবে এতে exprকমান্ডটি রয়েছে , যা এর তুলনা অপারেটরগুলি সহ পূর্ণসংখ্যার ক্রিয়াকলাপগুলির জন্য সি-এর মতো সিনট্যাক্সও প্রয়োগ করেছিল। শেল স্ক্রিপ্টে, শেল থেকে রক্ষা করতে অক্ষরগুলি <এবং >উদ্ধৃতি দিতে হত, যেমন if expr 1 \< 2; …সমান if test 1 -lt 2; …। শেলের গাণিতিক এক্সপ্রেশনগুলির সংযোজন exprঅপ্রচলিত বেশিরভাগ ব্যবহার করে , তাই এটি আজকাল সুপরিচিত নয়।

কোনও শ স্ক্রিপ্টে, আপনি একটি পূর্ণসংখ্যা মান গণনা [ … ]করতে এবং পূর্ণসংখ্যার তুলনা করতে সাধারণত পাটিগণিতের এক্সপ্রেশন ব্যবহার করেন ।

if [ "$((x + y))" -lt "$z" ]; then 

কোনও ksh, bash বা zsh স্ক্রিপ্টে আপনি ((…))উভয়ের জন্য ব্যবহার করতে পারেন ।

if ((x + y < z)); then 

[[ … ]]আপনি পূর্ণসংখ্যার ছাড়া অন্য কিছু জড়িত কন্ডিশন ব্যবহার করতে চান তাহলে ফর্ম দরকারী।


1

টেস্ট ম্যান পৃষ্ঠা অনুসারে, = এবং! = স্ট্রিং তুলনার জন্য ব্যবহৃত হয় যখন -eq, -gt, -lt, -ge, -le, এবং -ne সংখ্যার সাথে সংখ্যার তুলনা করা হয়। শেল স্ক্রিপ্টগুলি লেখার সময় আমি এই সম্মেলনটি সর্বদা অনুসরণ করেছি এবং এটি সর্বদা কার্যকর হয়। সচেতন হোন যে আপনার যদি অভিব্যক্তিতে ভেরিয়েবল থাকে তবে নাল তুলনা করা এড়াতে আপনার কোনওভাবে ভেরিয়েবলগুলি উদ্ধৃত করতে হতে পারে।

কাগজে, আমরা স্ট্রিং / সংখ্যা তুলনা অনেক চিন্তা ছাড়াই করি। অন্যদিকে একটি কম্পিউটার জানেন না যে 987 সংখ্যা বা অক্ষরের একটি স্ট্রিং। কম্পিউটারকে কী করতে হবে তা বলার জন্য আপনার বিভিন্ন অপারেটর প্রয়োজন যাতে আপনি সঠিক ফলাফল পান। কিছু অতিরিক্ত তথ্য নেই এখানে যে ইতিহাসের কিছু ব্যাখ্যা করে। মূলত, ভেরিয়েবলগুলি টাইপযুক্ত নয় এবং historicalতিহাসিক সামঞ্জস্যের পক্ষে সেভাবেই থেকেছে।


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