শেল ভেরিয়েবলের প্রসার এবং গ্লোব এর প্রভাব এবং এর উপর বিভক্ততা


18

এই পোস্টে আসলে দুটি পৃথক প্রশ্ন রয়েছে তবে আমি মনে করি এগুলিকে একসাথে করা আরও কিছু প্রসঙ্গ দেবে। আমি ভেরিয়েবলের চারপাশে উদ্ধৃতিগুলি নিয়ে এই প্রশ্নটি দিয়েছি তবে ভেরিয়েবলের প্রসারণটি প্রথম স্থানে কী বোঝায় তা আমি পুরোপুরি বুঝতে পারি না । সুতরাং আমার প্রথম প্রশ্নটি হ'ল:

  1. ইউনিক্স / লিনাক্স স্পিকারের পরিবর্তনশীল সম্প্রসারণ কী ?

আমার প্রশ্নের দ্বিতীয় অংশটি নিম্নলিখিত পদগুলির সাথে সম্পর্কিত:

  1. উল্লিখিত glob
  2. বিভক্ত করা

উপরের অর্থ কী এবং তারা পরিবর্তনশীল প্রসারণকে কীভাবে প্রভাবিত করে? মূল প্রশ্নের উত্তরে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

বিভাজন + গ্লোব অপারেটর হিসাবে উদ্ধৃতিগুলির (তালিকা প্রসঙ্গে) অনুপস্থিতির কথা ভাবেন।

যেন প্রতিধ্বনি $ পরীক্ষাটি প্রতিধ্বনি গ্লোব (বিভক্ত ("$ পরীক্ষা"))।

আমি এমন কোন উত্তর খুঁজে পাইনি যা সরাসরি গ্লোব্বিং এবং বিভাজনের ধারণাটিকে সম্বোধন করে তবে সাম্প্রতিককালের মতো অন্যান্য প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে এই পদগুলি সরাসরি ব্যবহার করে ।


উত্তর:


15

পরিবর্তনশীল প্রসার (স্ট্যান্ডার্ড শব্দটি প্যারামিটার সম্প্রসারণ , এবং এটিকে কখনও কখনও পরিবর্তনশীল প্রতিস্থাপনও বলা হয় ) এর মূল অর্থ হল ভেরিয়েবলকে এর মান দ্বারা প্রতিস্থাপন করা। আরো সঠিকভাবে, প্রতিস্থাপন মানে $VARIABLEকনস্ট্রাক্ট (অথবা ${VARIABLE}বা ${VARIABLE#TEXT}অন্য কিছু টেক্সট যা ভেরিয়েবলের মান থেকে নির্মিত হয় বা অন্যান্য নির্মান)। এই অন্যান্য পাঠ্যটি হল ভেরিয়েবলের সম্প্রসারণ।

সম্প্রসারণ প্রক্রিয়া নিম্নলিখিত হিসাবে যায়। (আমি কেবল সাধারণ ক্ষেত্রে আলোচনা করি, কিছু শেল সেটিংস এবং এক্সটেনশানগুলি আচরণটি পরিবর্তন করে)

  1. ভেরিয়েবলের মান নিন, যা একটি স্ট্রিং। যদি ভেরিয়েবল সংজ্ঞায়িত না হয় তবে খালি স্ট্রিংটি ব্যবহার করুন।
  2. যদি কনস্ট্রাক্টটিতে কোনও রূপান্তর অন্তর্ভুক্ত থাকে তবে এটি প্রয়োগ করুন। উদাহরণস্বরূপ, যদি কনস্ট্রাক্ট হয় ${VARIABLE#TEXT}এবং ভেরিয়েবলের মান শুরু হয় তবে মানটির শুরু থেকে TEXTসরিয়ে দিন TEXT
  3. যদি প্রসঙ্গটি একটি একক শব্দের জন্য কল করে (উদাহরণস্বরূপ ডাবল উক্তিগুলির মধ্যে, বা একটি কার্যের ডানদিকে, বা একটি এখানে নথির ভিতরে), এখানে থামুন stop অন্যথায় পরবর্তী পদক্ষেপগুলি দিয়ে চালিয়ে যান।
  4. সাদা স্থানের প্রতিটি ক্রমে পৃথক শব্দের মধ্যে মানটি বিভক্ত করুন। (ভেরিয়েবলটি IFSহোয়াইটস্পেস ব্যতীত অন্য চরিত্রগুলিতে বিভক্ত করতে পরিবর্তন করা যেতে পারে)) ফলস্বরূপ ফলাফলটি আর স্ট্রিং নয়, তবে স্ট্রিংগুলির একটি তালিকা। এই তালিকাটি খালি থাকতে পারে যদি মানটিতে কেবল সাদা স্থান থাকে।
  5. তালিকার প্রতিটি উপাদানকে একটি ফাইলের নাম ওয়াইল্ডকার্ড প্যাটার্ন, যেমন একটি গ্লোব হিসাবে বিবেচনা করুন । যদি প্যাটার্নটি কিছু ফাইলের সাথে মেলে তবে এটি ফাইলের নামের সাথে তাল মিলিয়ে প্রতিস্থাপন করবে, অন্যথায় এটি একা থাকবে।

উদাহরণ স্বরূপ, ধরুন পরিবর্তনশীল যে fooরয়েছে a* b* c*এবং বর্তমান ডিরেক্টরির ফাইল রয়েছে bar, bazএবং paz। তারপরে ${foo#??}নিম্নরূপে প্রসারিত হবে:

  1. ভেরিয়েবলের মান হ'ল 8-অক্ষরের স্ট্রিং a* b* c*
  2. #??এর অর্থ প্রথম দুটি অক্ষর ছাঁটাই, 6-অক্ষরের স্ট্রিংয়ের ফলে  b* c*(প্রাথমিক স্থান সহ)।
  3. যদি সম্প্রসারণ কোনও তালিকার প্রসঙ্গে থাকে (যেমন ডাবল উদ্ধৃতি বা অন্যান্য অনুরূপ প্রসঙ্গে নয়), চালিয়ে যান।
  4. স্ট্রিংটি সাদা স্থান-বিস্মৃত শব্দগুলিতে বিভক্ত করুন, ফলে দ্বি-স্ট্রিংয়ের একটি তালিকা তৈরি হয়: b*এবং c*
  5. স্ট্রিং b*, একটি নিদর্শন হিসাবে ব্যাখ্যা করা, দুটি ফাইলের সাথে মেলে: barএবং baz। স্ট্রিং c*কোনও ফাইলের সাথে মেলে না তাই এটি একা থাকে। ফলাফলের তিনটি স্ট্রিং একটি তালিকা রয়েছে: bar, baz, c*

উদাহরণস্বরূপ echo ${foo#??}প্রিন্টগুলি bar baz c*(কমান্ডটি echoতার মধ্যে একটি স্পেসের সাথে যুক্তিগুলিতে যোগ দেয়)।

আরও তথ্যের জন্য, দেখুন:


2
মনে রাখবেন যে বলা হচ্ছে পরামিতি সম্প্রসারণ করা হয়েছে কারণ এটি ভেরিয়েবল (প্রযোজ্য $var) এবং পরামিতি অন্যান্য ধরনের মত $1, $#, $?, $-...
Stéphane Chazelas

12

উল্লিখিত glob / বিভক্ত

আমি প্রথমে গ্লোব / স্প্লিট নেব। @ স্টিফেনের যে উত্তর আপনি যুক্ত করেছেন সেগুলি এই শব্দগুলি সাধারণ অর্থে ব্যবহার করছে। এগুলি প্রকৃত আদেশ বা এ জাতীয় কিছু নয়, কেবল ছদ্ম অপারেশন।

split("$test")উপাদানের একটি "অ্যারে" মধ্যে "$ পরীক্ষা" আপ বিষয়বস্তু বিভক্ত হবে।

glob(...)তবে এই উপাদান আছে যা যেমন শেল globbing অক্ষর কোন প্রসারিত করতে যত্ন নিতে হবে *বা ব্যাপ্তির [1-2]

উদাহরণ

আমাদের স্ট্রিং $testনিম্নলিখিত হিসাবে বলুন ।

$ test="afile[1-2] afile[3-5]"

এছাড়াও বলি যে আমাদের কিছু ডিরেক্টরি সহ একটি ডিরেক্টরি আছে।

$ ls -1
afile1
afile2
afile3
afile4
afile5

এখন যদি আমরা এটিকে উদ্ধৃতি না দিয়ে প্রতিধ্বনিত করার চেষ্টা করি তবে আপনার লক্ষ্য করা উচিত যে আমাদের স্ট্রিং স্পেসে বিভক্ত হয়ে গেছে এবং তারপরে কোনও গ্লোববিং অক্ষর প্রসারিত হয়েছে।

$ echo $test
afile1 afile2 afile3 afile4 afile5

তবে আমরা যদি ভেরিয়েবলটি উদ্ধৃত করি যখন আমরা এটির আর্গুমেন্ট হিসাবে পাস করি যখন আমরা echoআসল আক্ষরিক স্ট্রিংটি পেতে পারি।

$ echo "$test"
afile[1-2] afile[3-5]

পরিবর্তনশীল সম্প্রসারণ

ভেরিয়েবল এক্সপেনশন শব্দটি শেলটি এর মৌলিক ক্রিয়াকলাপের অংশ হিসাবে যে মৌলিক ক্রিয়াকলাপটি সম্পাদন করে তা আবৃত করে। শেলটি ইনপুট পার্সিংয়ের জন্য দায়ী এবং তারপরে এই ইনপুটটিকে সিন্টেক্সিকভাবে সঠিক হিসাবে গণ্য করা হয়েছে।

আমাদের আগের উদাহরণে। ভেরিয়েবলটি যখন অব্যর্থতার সাথে $testউপস্থাপন করা হয়েছিল তখন echoআমরা শেলকে বলছিলাম যে এগিয়ে যেতে হবে এবং সেই যুক্তিগুলি ভাগ করে নিন এবং তারপরে সেগুলি গ্লোব করুন।

যখন এটি উদ্ধৃত হয়েছিল, আমরা মূলত সেই বৈশিষ্ট্যটি অক্ষম করছিলাম যা কখনও পরিবর্তনশীল (গুলি) দ্বিগুণ উদ্ধৃতি দিয়ে মুড়ে ফেলেছিলাম।

উদাহরণ

গ্লোব্বিং এবং বিভাজনের কয়েকটি অতিরিক্ত উদাহরণ এখানে।

গ্লোব / বিভাজন স্বয়ংক্রিয়ভাবে ঘটে

$ echo file{1..3}
file1 file2 file3

$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb

$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD

$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC

গ্লোব / বিভাজন ডাবল উদ্ধৃতি মাধ্যমে অক্ষম

$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC

$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}

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