ব্যাশে অনাকাঙ্ক্ষিত অক্ষরের সাথে মেলে ব্র্যাকেট এক্সপ্রেশন (ব্যাপ্তি ছাড়াই)


20

আমি লিনাক্সে ব্যাশ ব্যবহার করছি। আমি যদি বিবৃতিটি নীচের থেকে একটি সাফল্য পাচ্ছি তবে এটি কি একটি ব্যর্থ কোডটি ফেরত দেবে না?

if [[  = [⅕⅖⅗] ]] ; then echo yes ; fi

স্কোয়ারটি কোনও অক্ষরের সমান হয় না, তাই আমি কেন একটি সাফল্য কোড পাই তা দেখতে পাচ্ছি না।

আমার ক্ষেত্রে ডাবল বন্ধনী রাখা আমার পক্ষে গুরুত্বপূর্ণ।

এই দৃশ্যে কোনও ব্যাপ্তি করার কোনও অন্য উপায় আছে, বা অন্য কোনও পরামর্শ?


2
সম্ভবত আপনার লোকালয়ে একটি অপরিজ্ঞাত বাছাইয়ের অর্ডার থাকা সমস্ত অক্ষরের পরিণতি (এবং এইভাবে এটি একইভাবে বাছাই করা)। অস্টিন গ্রুপে চলমান, সম্পর্কিত আলোচনা দেখুন । এটি ঠিক করার জন্য লোকালে সিটিতে পরিবর্তন করুন
স্টাফেন চেজেলাস

1
দুঃখিত, Cএটি এখানে করবেন না কারণ এটি একক-বাইট অক্ষর নয়। C.UTF-8যেখানে উপলব্ধ সেখানে করতে হবে।
স্টাফেন চেজেলাস

11
অভিনন্দন, আপনি আপনার প্রথম প্রশ্নে অস্টিন গ্রুপের থ্রেডে স্টাফেনকে তলব করতে সক্ষম হয়েছেন। এটি কমপক্ষে Inter একটি ইন্টারনেটসের মূল্য হতে পারে। বা ⅘ বা এমনকি ■ ইন্টারনেটস, যেমন দৃশ্যত সেগুলি একই। ইউনিক্স ও লিনাক্স এ আপনাকে স্বাগতম , এবং দয়া করে আকর্ষণীয় প্রশ্নগুলি আনতে থাকুন।
ডারোবার্ট

উত্তর:


29

একই অক্ষর অনুসারে সেই অক্ষরগুলির ফলাফল That's

আপনি এটি লক্ষ্য করবেন

sort -u << EOF




EOF

কেবল একটি লাইন প্রদান করে।

বা যে:

expr  = 

সত্য (পিএসআইএক্সের প্রয়োজন অনুসারে) প্রদান করে।

জিএনইউ সিস্টেমে প্রেরিত বেশিরভাগ স্থানীয় অবস্থানগুলিতে অনেকগুলি অক্ষর রয়েছে (এবং এমনকি অক্ষরের ক্রমগুলিও (কোলটিং সিকোয়েন্সগুলি)) যা একই বাছাইয়ের ক্রম রয়েছে। এই ⅕⅖⅗ ⅕⅖⅗ এর ক্ষেত্রে, কারণ অর্ডারটি সংজ্ঞায়িত করা হয়নি, এবং যে অক্ষরগুলির অর্ডার সংজ্ঞায়িত করা হয়নি তাদের জিএনইউ সিস্টেমে একই বাছাইয়ের ক্রম থাকা শেষ হয়। এমন অক্ষর রয়েছে যেগুলি Ș এবং like এর মতো একই বাছাইয়ের ক্রম হিসাবে স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে (যদিও এটি আমার কাছে কোনওভাবেই প্রকাশিত হয়নি) এটি কীভাবে হয় তার বাস্তব যুক্তি বা ধারাবাহিকতা)।

এটি বেশ অবাক করা এবং বোগাস আচরণের উত্স। আমি খুব সম্প্রতি অস্টিন গ্রুপে (পসিক্স এবং সিঙ্গেল ইউএনএক্স স্পেসিফিকেশনের পিছনে বডি) মেলিং তালিকায় বিষয়টি উত্থাপন করেছি এবং 2015-04-03 পর্যন্ত আলোচনা এখনও চলছে।

এই ক্ষেত্রে, কোথায় [y]মিলছে এবং একইটি সাজানো উচিত কিনা তা আমার কাছে অস্পষ্ট but তবে যেহেতু বন্ধনী প্রকাশটি কোনও কোলটিং উপাদানটির সাথে মেলে তাই বোঝা যায় যে আচরণটি প্রত্যাশিত।xxybash

যে কোনও ক্ষেত্রে, আমি মনে করি [⅕-⅕]বা কমপক্ষে মিলানো [⅕-⅖]উচিত

আপনি লক্ষ্য করবেন যে বিভিন্ন সরঞ্জাম আলাদাভাবে আচরণ করে। ksh93 bashGNU এর মতো আচরণ করে grepবা sedনা করে। কিছু অন্যান্য শেলের বিভিন্ন আচরণ রয়েছে যার কিছু yashবেশি বগির মতো।

সামঞ্জস্যপূর্ণ আচরণ করতে আপনার একটি লোকেল প্রয়োজন যেখানে সমস্ত অক্ষর আলাদা আলাদাভাবে সাজান। সি লোকেলটি সাধারণত একটি। তবে বেশিরভাগ সিস্টেমে সি লোকালে সেট করা চরিত্রটি ASCII। জিএনইউ সিস্টেমে আপনার কাছে সাধারণত একটি C.UTF-8লোকালে অ্যাক্সেস থাকে যা ইউটিএফ -8 অক্ষরটিতে কাজ করার পরিবর্তে ব্যবহার করা যেতে পারে।

তাই:

(export LC_ALL=C.UTF-8; [[  = [⅕⅖⅗] ]])

বা মান সমতুল্য:

(export LC_ALL=C.UTF-8
 case  in ([⅕⅖⅗]) true;; (*) false; esac)

মিথ্যা ফিরে আসা উচিত।

অন্য বিকল্পটি কেবল LC_COLLATEসি- তে সেট করা হবে যা জিএনইউ সিস্টেমে কাজ করবে, তবে অন্যের ক্ষেত্রে এটি প্রয়োজনীয় নয় যেখানে এটি মাল্টি-বাইট চরিত্রের বাছাইয়ের ক্রম নির্দিষ্ট করতে ব্যর্থ হতে পারে।


এর একটি পাঠ হ'ল সাম্যতা যেমন স্ট্রিংয়ের সাথে তুলনা করার ক্ষেত্রে প্রত্যাশা করা ততটা পরিষ্কার ধারণা নয়। সমতা অর্থাত্ কঠোর থেকে কঠোরতম হতে পারে।

  1. একই সংখ্যক বাইট এবং সমস্ত বাইট উপাদানগুলির একই মান রয়েছে।
  2. অক্ষরের সংখ্যা এবং সমস্ত অক্ষর একই (উদাহরণস্বরূপ, বর্তমান অক্ষরে একই কোডপয়েন্ট দেখুন)।
  3. দুটি স্ট্রিংয়ের লোকেলের কোলেশন অ্যালগরিদম অনুসারে একই বাছাইয়ের ক্রম রয়েছে (এটি কোনও <b বা b> a সত্য নয়)।

এখন, 2 বা 3 এর জন্য, ধরে নেওয়া হয়েছে যে উভয় স্ট্রিংয়ে বৈধ অক্ষর রয়েছে। ইউটিএফ -8 এবং কিছু অন্যান্য এনকোডিংগুলিতে কিছু বাইটের ক্রম বৈধ অক্ষর তৈরি করে না।

1 এবং 2 অগত্যা এটির কারণে সমতুল্য নয় বা কিছু অক্ষরগুলির একাধিক সম্ভাব্য এনকোডিং থাকতে পারে। এটি সাধারণত আইএসও -২২২২-জেপির মতো রাষ্ট্রীয় এনকোডিংয়ের ক্ষেত্রে যেখানে Aপ্রকাশিত হতে পারে 41বা 1b 28 42 41( 1b 28 42ASCII এ স্যুইচ করার ক্রম হতে পারে এবং আপনি যতগুলি চান তার মধ্যে অনেকগুলি canোকাতে পারেন, এতে কোনও তফাত হবে না), যদিও আমি এই ধরণের এনকোডিংটি এখনও ব্যবহারের প্রত্যাশা করবে না এবং জিএনইউ সরঞ্জামগুলি সাধারণত তাদের সাথে সঠিকভাবে কাজ করে না don't

এছাড়াও সাবধান যে বেশিরভাগ নন-জিএনইউ ইউটিলিটিগুলি 0 বাইট মান (ASCII এর NUL চরিত্র) সাথে ডিল করতে পারে না।

এই সংজ্ঞাগুলির মধ্যে কোনটি ব্যবহৃত হয় তা ইউটিলিটি এবং ইউটিলিটি বাস্তবায়ন বা সংস্করণের উপর নির্ভর করে। POSIX এটিতে 100% পরিষ্কার নয়। সি লোকালে, সমস্ত 3 সমান। এর বাইরে ওয়াইএমএমভি।


আর একটি সাধারণ ক্ষেত্রে যেখানে ইউনিকোডে অক্ষরগুলির সংমিশ্রণের মতো জিনিস রয়েছে 1
গিলস

@ গিলস, সমন্বয়যুক্ত অক্ষরগুলি তাদের নিজস্ব চরিত্র। সংমিশ্রণটি একটি গ্রাফেম / সেল গঠন করে তবে এখনও বেশ কয়েকটি অক্ষর দ্বারা গঠিত। U (U + 00E9) এবং é (E + U + 0301 দ্বারা অনুসরণ করা) একই গ্রাফেম, তবে চরিত্রের দুটি পৃথক ক্রম (কমপক্ষে POSIX এপিআই দৃষ্টিকোন থেকে)। 1 এবং 2 দ্বারা, তারা আলাদা হবে। 3 দ্বারা, তারা সমতুল্য বিবেচনা করতে পারে যদি ইউ + 0301 এর সমস্ত কোলেশন ওজন "আইজিএনরে" তে সেট করা থাকে তবে সাধারণত ডায়ারটিক্সের আদেশের বিষয়ে সিদ্ধান্ত নিতে চাইলে এটি সাধারণত তেমনটি হয় না।
স্টাফেন চেজেলাস

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

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

@ গিলিস, পসিক্স লোকেল কোলেশন অ্যালগরিদমের ওজনগুলি ফ্রেঞ্চ অভিধানটি বাছাই করতে পারে। ওজন এভাবেই কাজ করে। প্রথম পাসটি প্রাথমিক ওজন ব্যবহার করে (যেখানে ই এবং é (এবং ই এবং É) একই থাকে এবং সংমিশ্রিত তীব্র উচ্চারণ উপেক্ষা করা হয়) একটি দ্বিতীয় পাস (সমান হলে) উচ্চারণগুলি পরীক্ষা করে, একটি তৃতীয় পাসের মূলধন ...
স্টাফেন চাজেলাস

-3

আপনি এটি ভুল করছেন, =এবং ==একই নয়।

এই উদাহরণগুলি ব্যবহার করে দেখুন:

if [[ "■" == "[⅕⅖⅗]" ]] ; then echo yes ; else echo no ; fi

if [[ "1" == "1" ]] ; then echo yes ; else echo no ; fi

if [[ "■" == "■" ]] ; then echo yes ; else echo no ; fi

1
এটা সত্যি না. পসআইএক্স উল্লেখ করে যে =সমতা পরীক্ষা করার জন্য অপারেটরটি ব্যবহার করা উচিত। সমস্যাটি অনুপস্থিত উদ্ধৃতিগুলি, অপারেটর নয়।
স্কাই

1
এছাড়াও man bashমধ্যে বলছেন [[অধ্যায়: "= অপারেটরের == সমতুল্য।"
মিচাস

1
@scai, পসিক্স [[...]]অপারেটর নির্দিষ্ট করে না । এবং = এবং == শেলগুলিতে একই হয় এটি কার্যকর করা হয়েছিল (ksh / bash / zsh) এবং প্যাটার্ন মিলের জন্য, সাম্য নয়।
স্টাফেন চেজেলাস

কোনও প্যাটার্নের সাথে তুলনা করার সময়, প্যাটার্নটি উদ্ধৃত করা উচিত নয়, অন্যথায় এটি একটি আক্ষরিক স্ট্রিং হিসাবে নেওয়া হয়, সুতরাং প্রথম পরীক্ষায় "না"।
xhienne
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.