উত্তর:
এই লাইনটি স্ক্রিপ্টের প্রথম আর্গুমেন্টের জন্য দুটি ব্যাকস্ল্যাশগুলি প্রস্তুত করে। প্রতিটি জোড়ের প্রথম ব্যাকস্ল্যাশ দ্বিতীয় থেকে পালিয়ে যায়।
node="\\\\$1"
এই লাইনটি পূর্বেরটির ফলাফল গ্রহণ করে এবং দ্বিতীয় যুক্তিতে প্রতিটি স্ল্যাশকে দুটি ব্যাকস্ল্যাশ করে প্রতিস্থাপনের ফলাফল সংযোজন করে।
echo $node`echo $2|sed 's/\//\\\\/g'`
আপনি যদি আপনার স্ক্রিপ্টটিকে এভাবে কল করেন:
scriptname abc /def/ghi/jkl
তারপরে $node
"\\ abc" হবে এবং নিম্নলিখিতটি প্রতিধ্বনিত হবে:
\\abc\\def\\ghi\\jkl
$1
এবং $2
যেমন অবস্থানগত পরামিতি উল্লেখ করা এবং আপনার স্ক্রিপ্টে প্রথম ও দ্বিতীয় আর্গুমেন্ট প্রতিনিধিত্ব করছে। আপনি যদি কয়টি (আপনার সিস্টেমের সীমা নির্ধারিত সীমা অবধি) নির্বিশেষে আপনি যদি তাদের সকলকে একত্রে উল্লেখ করতে চান তবে আপনি ব্যবহার করতে পারেন $@
বা $*
।
এই দুটি লাইন লেখার জন্য এখানে আরও ভাল উপায়:
node='\\'"$1"
ব্যাকস্ল্যাশগুলির চারপাশে একক উদ্ধৃতি ব্যবহার করে আপনার এড়াতে হবে না। অবস্থানগত প্যারামিটারের চারপাশে ডাবল উদ্ধৃতি ব্যবহার করা এটি প্রসারিত করার অনুমতি দেয়।
echo $node$(echo $2 | sed 's|/|\\\\|g')
$()
ব্যাকটিকগুলির পরিবর্তে ব্যবহার করা আরও পঠনযোগ্য, এগুলি সহজেই বাসা বাঁধতে পারে এবং উদ্ধৃতি দেওয়া এবং পালানো সহজ হয়। বিকল্প ডিলিমিটার ব্যবহার করে (এই ক্ষেত্রে পাইপের প্রতীক) sed
আপনার স্ল্যাশ থেকে বাঁচতে হবে না এবং পুরো জিনিসটি আরও পঠনযোগ্য। এই ক্ষেত্রে ব্যাকস্ল্যাশগুলি এখনও পালাতে হবে, কারণ sed
বাশের পরিবর্তে সেগুলি প্রক্রিয়া করা হচ্ছে।
যদি আপনি $()
(বা ব্যাকটিক্স) এর সাথে পরিচিত না হন তবে তারা কমান্ড প্রতিস্থাপন সম্পাদন করে যার অর্থ সংযুক্ত কমান্ড (গুলি) এর আউটপুট তাদের জায়গায় প্রতিস্থাপিত হয়।
আপনার সাথে পরিচিত নাও হতে পারেন sed
। এটি ব্যাশ (বা অন্যান্য শাঁস) এর বাহ্যিক এমন একটি ইউটিলিটি যা অক্ষরের স্ট্রিম নিতে এবং এডিট করতে পারে। এখানে ব্যবহৃত বিশেষ কমান্ডটি হ'ল s
বিকল্পটি। এটি দ্বিতীয় এবং তৃতীয় সীমানা (সাধারণত স্ল্যাশ করে তবে আপনি প্রায় কোনও চরিত্রই ব্যবহার করতে পারেন) এর মধ্যে যা পাওয়া যায় তা প্রথম এবং দ্বিতীয় প্রেরণকারীদের মধ্যে প্যাটার্নের পরিবর্তে পাওয়া যাবে। এটি g
এমন একটি পরিবর্তনকারী যা বিশ্বব্যাপী প্রতিস্থাপনের কারণ ঘটায় (অর্থাত প্রতিটি সময় ইনপুট লাইনে এটি ঘটে)। ইনপুট প্রতিটি লাইন জন্য প্রক্রিয়া পুনরাবৃত্তি হয়। আপনার উদাহরণে কেবলমাত্র একটি লাইন ইনপুট রয়েছে - প্রতিধ্বনের আউটপুট।
প্রথম লাইন: নোড কমান্ড লাইন থেকে একটি পরিবর্তনশীল সেট। সুতরাং, আপনি যদি
runme.sh test
নোড "\ পরীক্ষা" সমান হবে। প্রথম স্ল্যাশ দ্বিতীয় স্ল্যাশ থেকে বেরিয়ে যায়, এটি একটি বিশেষ সংশোধক পরিবর্তে আক্ষরিক স্ল্যাশ হিসাবে বিবেচনা করে।
তারপরে, এটি নামের কোনও ব্যাকস্ল্যাশকে দুটি ফরোয়ার্ড স্ল্যাশ, এর মতো প্রতিস্থাপন করে
> runme.sh test/ing
\\test\\ing
তারপরে, সম্ভবত এটি অন্য একটি প্রোগ্রাম দ্বারা ব্যাখ্যা করা হবে, যা স্ল্যাশগুলিকে ইন্টারপেনেটরেটেড করে, সুতরাং সেখানে তাদের দুটি হওয়া দরকার।
এই লাইনের কোন অংশগুলি বুঝতে আপনার সমস্যা হচ্ছে তা পরিষ্কার নয়, সুতরাং আমি কী বলে মনে করি এটি স্টিকি অংশ বলে বোঝানোর চেষ্টা করব।
আপনি যে স্ক্রিপ্টটিতে কাজ করছেন তাতে কমপক্ষে দুটি যুক্তি লাগে। এই যুক্তিগুলি স্ক্রিপ্টের মধ্যে $ 1 এবং $ 2 নামে অ্যাক্সেস করা হয় । প্রথম লাইনে প্রথম ব্যাকস্ল্যাশ অক্ষরটিকে অনুসরণ করে, দ্বিতীয় ব্যাকস্ল্যাশ এড়িয়ে যায়, যাতে জোড়টিকে একক আক্ষরিক ব্যাকস্ল্যাশ হিসাবে মূল্যায়ন করা হয়। দ্বিতীয় জোড়া ব্যাকস্ল্যাশের ক্ষেত্রেও একই কথা। $ 1 স্ক্রিপ্টে প্রথম আর্গুমেন্ট মান দ্বারা প্রতিস্থাপিত হয়। স্ক্রিপ্ট হিসাবে চালানো হয়
myscript apple banana/cantaloupe
নোডের মান কোট ছাড়াই "\\ আপেল" হবে।
পিছনের টিকের (`) কমান্ডগুলি কার্যকর করা হয়, তারপরে পিছনের টিকগুলি এবং সংযুক্ত কমান্ডগুলি সেই কমান্ডগুলির আউটপুট দ্বারা প্রতিস্থাপিত হয়। sed
কমান্ড ব্যাকস্ল্যাশ একজোড়া দ্বারা তার ইনপুট স্ট্রিম প্রতিটি ফরোয়ার্ড স্ল্যাশ প্রতিস্থাপন করে। যেহেতু এই উদাহরণে $ 2 হ'ল "কলা / ক্যান্টালাপ", তাই পিছনের টিকগুলির মধ্যে থাকা কমান্ডগুলির ফলাফল "কলা \\ ক্যান্টালাপ" হবে। দ্বিতীয় লাইনের আউটপুট হ'ল ব্যাক-টিক এক্সপ্রেশন বা "\\ আপেলবানানা \\ ক্যান্টালাপ" এর ফলাফলের সাথে সংযুক্ত নোডের মান ।
/
এটি একটি "ফরোয়ার্ড" স্ল্যাশ। `\` একটি ব্যাকস্ল্যাশ।