পরোক্ষ সম্প্রসারণ কী? $ {! Var *} এর অর্থ কী?


87

আমি " প্রাথমিকভাবে বাশ গাইড " পড়ছি । এটা বলে:

এর প্রথম চরিত্রটি PARAMETERযদি একটি বিস্ময়বোধক বিন্দু হয় তবে ব্যাশটি ভেরিয়েবলের PARAMETERনাম হিসাবে বাকী থেকে গঠিত ভেরিয়েবলের মান ব্যবহার করে ; এই পরিবর্তনশীলটি তখন প্রসারিত হয় এবং সেই মানটি PARAMETERনিজের মানের পরিবর্তে বাকী বিকল্পটিতে ব্যবহৃত হয়। এটি পরোক্ষ সম্প্রসারণ হিসাবে পরিচিত।

প্রদত্ত উদাহরণটি হ'ল:

franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

আমি এখানে বেশ বুঝতে পারি না:

বাকিটির থেকে গঠিত ভেরিয়েবলের মান PARAMETER

ঠিক যেমনটি PARAMETERঠিক !N*তখনই

বাকি গুলো PARAMETER

ঠিক হয় N*। কিভাবে এই পরিবর্তনশীল গঠন করতে পারে? বাশ কি সেখানে সম্ভাব্য সমস্ত কমান্ড অনুসন্ধান করেছিল?

উত্তর:


112

আপনি যদি bashম্যান পৃষ্ঠাটি পড়েন তবে এটি মূলত যা বলেছে তা নিশ্চিত করে:

যদি প্যারামিটারের প্রথম অক্ষরটি একটি বিস্মৃত বিন্দু ( !) হয় তবে ভ্যারিয়েবল ইন্ডিরেশনের একটি স্তর চালু করা হয়। বাশ অন্যান্য প্যারামিটার থেকে গঠিত ভেরিয়েবলের মানটি ভেরিয়েবলের নাম হিসাবে ব্যবহার করে; এই পরিবর্তনশীলটি তখন প্রসারিত হয় এবং সেই মানটি প্যারামিটারের মানের পরিবর্তে বাকী বিকল্পে ব্যবহৃত হয়। এটি পরোক্ষ সম্প্রসারণ হিসাবে পরিচিত।

তবে সেখান থেকে পড়া:

এর ব্যতিক্রমগুলি হ'ল বিস্তৃত ${!prefix*}এবং ${!name[@]}নীচে বর্ণিত।

${!prefix*}উপসর্গের সাথে মিলছে নাম। ভেরিয়েবলের নামগুলিতে প্রসারিত হয় যার নাম প্রিফিক্স দিয়ে শুরু হয়, IFSবিশেষ ভেরিয়েবলের প্রথম অক্ষর দ্বারা পৃথক ।

অন্য কথায়, আপনার বিশেষ উদাহরণ ${!N*}একটি হল ব্যতিক্রম নিয়ম আপনি উদ্ধৃত করা হয়। এটা তোলে নেই , তবে, কাজ যেমন প্রত্যাশিত ক্ষেত্রে, বিজ্ঞাপন হিসাবে:

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plugh
plugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave

4
উত্তর করার জন্য ধন্যবাদ. আমি "শিক্ষানবিশদের জন্য বাশ গাইড" যতই পড়ি ততই আমি নিজেকে জিজ্ঞাসা করি যে লেখক কী লেখেন সে বুঝতে পারে কিনা।
— এলআরডিপিআরডিএক্সএক্স

24

প্রদত্ত "ইন্ডিয়ারেশন" একটিতে শেষ হয়ে গেলে এখানে ব্যতিক্রম *দেখা যায়। এই ক্ষেত্রে, এটি সমস্ত পরিবর্তনশীল নাম দেয় যা আপনার নির্দিষ্ট অংশ ( Nএখানে) দিয়ে শুরু হবে। বাশ এটি করতে পারে কারণ এটি ভেরিয়েবলগুলি ট্র্যাক করে এবং কোনটি বিদ্যমান তা জানে।

সত্যিকারের দিকনির্দেশনা হ'ল:
বলুন যে আমার কাছে একটি ভেরিয়েবল $VARIABLEসেট আছে 42এবং আমার আরও একটি ভেরিয়েবল $NAMEসেট আছে VARIABLE। ${!NAME}আমাকে দিতে হবে 42। অন্যটির নাম বলতে আপনি একটি ভেরিয়েবলের মান ব্যবহার করেন:

$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42

6
বাহ, কে জানত জীবনের অর্থ, মহাবিশ্ব এবং সমস্ত কিছুর উত্তর পাওয়া এত সহজ!
— কমোডোডেভ

3

হ্যাঁ, এটি! এর পরে ভেরিয়েবলের সমস্ত সম্ভাব্য বিস্তারের অনুসন্ধান করে। আপনি যদি এটি করেছেন:

echo ${!NP*}

আপনি কেবল পাবেন NPX_PLUGIN_PATH।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

:~> export myVar="hi"
:~> echo ${!my*}
    myVar
:~> export ${!my*}="bye"
:~> echo $myVar
    bye

আমার * এর সাথে মেলে এমন অন্যান্য ভেরিয়েবলগুলিও কি "বাই" তে সেট হবে?
— অ্যান্টনি

4
${!my*}@ অ্যান্টনি আমি এটি চেষ্টা করেছিলাম, এবং যদি আমার A, মাইবি, মাইএর প্রসারিত হয় তবে তার বর্তমান মানটি রফতানি করা হয় এবং মাইবিটি "বাই" এ সেট হয়ে রফতানি হয়। খুব দরকারী না।
— GKFX

3

আপনি ইন্ডিয়ারেশন প্রসেসিংয়ে একটি ব্যতিক্রমকে আঘাত করেছেন, যেখানে শেষ চরিত্রটি থাকলে *, পূর্বে প্রদত্ত উপসর্গযুক্ত সমস্ত ভেরিয়েবলগুলি ফিরিয়ে দেওয়া হবে।


তাহলে *কেস কেটে রেখে , এই কি একই রকম ${${VAR}}?
— ক্রোনস্পোন

4
@ ক্রোনস্পুন, ${${VAR}}আরও শীঘ্রই লিখিতভাবে ${$VAR}বৈধ নয়, যেহেতু $VARএকটি স্ট্রিং প্রদান করে, যা $চিহ্নটি অনুসরণ করতে পারে না ; একটি পরিবর্তনশীল নাম হিসাবে একটি স্ট্রিং ব্যবহার করার জন্য আপনাকে এক স্তর নির্দেশনা (মূল প্রশ্নে উদ্ধৃত হিসাবে) প্রবর্তন করতে হবে, অর্থাত আপনি ব্যবহার করতে পারেন ${!VAR}, যা আপনি যা আশা করেন ঠিক তা করেন (ভুলভ্রান্তরূপে তবে বোধগম্য) ${$VAR}করেন।
— এনিলিকো

0

প্রামাণিক তথ্যের জন্য আপনি এই GNU ডকটিকে ব্যাশ করতে পারেন

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

তবে মূলত, অপ্রত্যক্ষ সম্প্রসারণ ${!prefix*} ব্যতিক্রমগুলির একটি হিসাবে সম্পাদিত হয় না , উদাহরণস্বরূপ, এন উপসর্গ।

দস্তাবেজটি ব্যাখ্যা করবে যে বাশে অপ্রত্যক্ষ সম্প্রসারণ কী

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.