শেলটিতে $ {$ # same একই ফলাফল কেন আসে?


18

সর্বশেষ অবস্থানগত প্যারামিটার সেট আপ করার চেষ্টা করার সময় /bin/dash, আমি চেষ্টা করেছি echo ${$#}। আশ্চর্যজনকভাবে এর ফলে কোনও ত্রুটি ঘটেনি, তবে পিআইডি-তে পরিণত হয়েছে যা $$ভেরিয়েবলের সামগ্রী হিসাবে সমান । প্রশ্ন, কেন সেই সিনট্যাক্সটি কাজ করেছিল? শেলটি এখানে প্রয়োগ করা সিনট্যাক্স নিয়ম কী?

মূলত, আমি যা করেছি তা হ'ল

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

স্পষ্টতই, এই %ধরনের নির্মাণে চরিত্রও উপেক্ষা করা হয়

$ echo ${$%}
13819

কিন্তু *এবং @খারাপ প্রতিস্থাপনের ত্রুটির ফলস্বরূপ:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
আপনি কী আশা করছেন ${$*}এবং ${$@}উত্পাদন করবেন?
— Kusalananda

2
@ কুসালানন্দ আমি পাশে অন্যান্য অক্ষরের চেষ্টা ছিল #এবং %কি থেকে আচরণ ফলাফল নেই।
— সের্গেই কলডিয়াজনি

1
ড্যাশে প্রকৃতপক্ষে ইন্ডিয়ারেশন করতে eval, যেমন , ব্যবহার করুন dash -c 'set 1 2 3 4 5; eval "echo \$$#"'। সূত্র: উবুন্টু উইকি
— wjandrea

1
@ wjandrea ইয়েপ, ইতিমধ্যে এটি সম্পর্কে সচেতন। এটি সম্পর্কে ইতিমধ্যে ইতিমধ্যে একটি প্রশ্ন রয়েছে: stackoverflow.com/questions/1853946/… আমি প্রথমে প্রশ্নটি না পড়ে নিজেই একটি পদ্ধতি আবিষ্কার করার চেষ্টা করছিলাম (এবং আমি ইতিমধ্যে for i; do true; doneশেষ আইটেমটি পেতে জানতাম $i) তবে আরও মার্জিত কিছু খুঁজছিলাম। evalঅবশ্যই সম্ভাব্য সমস্যা থাকতে পারে, কতটা ভাবল - এটি অন্য একটি বিষয়। তবে হ্যাঁ, এটি একটি বিকল্প
— সের্গেই কলডিয়াজহনি

উত্তর:


35

এটি $$ খালি উপসর্গ সরানো সহ :

${parameter#[word]}

ক্ষুদ্রতম উপসর্গ প্যাটার্ন সরান । শব্দ একটি প্যাটার্ন উত্পাদন করতে সম্প্রসারিত করা হবে। প্যারামিটারের প্রসারণের পরে প্যারামিটারের ফলাফল হবে , উপসর্গটির ক্ষুদ্রতম অংশটি প্যাটার্নটি মোছার সাথে মিলবে। যদি উপস্থিত থাকে তবে শব্দের শুরু হবে না শুরুর সাথে #।

একই %( প্রয়োগ ) প্রত্যয় জন্য প্রযোজ্য । @এবং *প্যারামিটার সম্প্রসারণ সংশোধক নয়, তাই এগুলি ত্রুটি। এটা তোলে জন্য ঘটতে পারে $?, $-অথবা একটি কল্পিত $=হিসাবে ভাল। ${$+}এটি একটি ফাঁকা সম্প্রসারণ।


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