শেলটিতে $ {$ # 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.