পরোক্ষ সম্প্রসারণ কী? $ {! 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.