শেল স্ক্রিপ্টগুলিতে $ {0% / * What কী করে?


17

দুঃখিত যদি এটি একটি বোকা প্রশ্ন, তবে আমি এটি সম্পর্কে সাফল্য ছাড়াই অনুসন্ধান করেছি।

দ্বিতীয় লাইনের ঠিক কী কাজ করে?:

#!/bin/sh
cd ${0%/*} || exit 1

আমি জানি প্রথমটি হল শেবাং, দ্বিতীয়টি ডিরেক্টরি পরিবর্তন করার চেষ্টা করে তবে বিভ্রান্তিকর অংশটি ${0%/*}

আপনি আমাকে দ্বিতীয় লাইনের ব্যাখ্যা করতে পারেন?


2
যেমনটি একটি উত্তরে আন্দ্রে ব্যাখ্যা করেছেন, oking {0% / * the ডিরেক্টরিটি স্ক্রিপ্টের নামের সাথে পূর্বনির্ধারিত ডিরেক্টরি পাথটিতে অনুবাদ করে to বিকল্পটি হ'ল বিল্ট-ইন dirnameকমান্ডটি ব্যবহার করা যেমন$(dirname $0)
সর্বদা

@ ওলওয়েজ ওয়ার্লিং: আপনি যে শেল এবং শেল সংস্করণটি dirnameতৈরি করেছেন তা ব্যবহার করছেন? এটি অবশ্যই বাশ v4.3.11 এ নেই যা উবুন্টু ট্রাস্টির ডিফল্ট শেল।
ডেভিড ফোরস্টার

বিভ্রান্তির জন্য আমার ক্ষমা চাইছি, এটি কেবল শেল্ট dirnameঅন্তর্নির্মিত নয় checked
সর্বদা

উত্তর:


27

${0}স্ক্রিপ্টের প্রথম যুক্তি, যেমন স্ক্রিপ্টের নাম বা পথ। আপনি আপনার স্ক্রিপ্টটি যেমন আরম্ভ তাহলে path/to/script.sh, তারপর ${0}ঠিক স্ট্রিং হতে হবে: path/to/script.sh

%/*অংশ মান পরিবর্তন ${0}। এর অর্থ: /কোনও ফাইলের নাম না হওয়া পর্যন্ত সমস্ত অক্ষর নিন । উপরের উদাহরণে, ${0%/*}হবে path/to

আপনি এটি আপনার শেলের ক্রিয়াতে দেখতে পাচ্ছেন:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh অন্যান্য অনেক ধরণের "প্যারামিটার সাবস্টিটিউশন" সমর্থন করে। উদাহরণস্বরূপ, পাথের পরিবর্তে ফাইলের নাম কীভাবে নেওয়া যায় তা এখানে:

$ echo "${x##*/}"
script.sh

সাধারণত, %এবং %%ফালা প্রত্যয়, যখন #এবং ##উপসর্গ স্ট্রিপ। আপনি প্যারামিটার বিকল্প সম্পর্কে আরও পড়তে পারেন ।


2
এই "|| প্রস্থান 1" অপ্রয়োজনীয় বলে মনে হচ্ছে: দির পরিবর্তন করা এখনই কি হবে $? সমান 1.
জোসেফ ক্লিমুক

2
কন্ট্রাক্টটি ম্যানুয়ালটিতে "ম্যাচিং উপসর্গ / প্রত্যয় প্যাটার্ন সরান" হিসাবে নথিভুক্ত করা হয়েছে উল্লেখ করা ভাল লাগবে। যা মনে রাখার একটি দুর্দান্ত উপায় যা # টি শিফট 3 ( $ এর বাম ),% হ'ল কমপক্ষে মার্কিন কীবোর্ডে শিফট 5 ( $ এর ডান ) হয়।
chexum

1
@ জোসেফক্লিমুক: || exit 1 সম্ভবত প্রয়োজন হতে পারে কারণ ত্রুটিযুক্ত cdঅবস্থায় 1 নয়, স্ট্যাটাস 2 দিয়ে প্রস্থান হতে পারে । তবে আমি সম্মত হই যে এটি খুব কার্যকর নয় (সাধারণত প্রোগ্রামগুলি নির্দিষ্ট প্রস্থান স্থিতিগুলির যত্ন করে না)। সম্ভবত এটি কোনও বৃহত্তর স্ক্রিপ্টের অংশ?
আন্দ্রে কার্বেলিনী

1
পছন্দ করুন এটি বেশিরভাগ ক্ষেত্রে কার্যকরভাবে ব্যবহার করতে পারে এমন একমাত্র উপায় বৃহত্তর স্ক্রিপ্টের অংশ হিসাবে। একটি স্ক্রিপ্ট যা কেবল বর্তমান ডিরেক্টরি পরিবর্তন করে তার কোনও প্রভাব নেই, কারণ এটি কেবলমাত্র সেই স্ক্রিপ্টটিতে চলমান শেলকেই প্রভাবিত করে। অভিভাবক প্রক্রিয়া এটি কখনই দেখে না।
এইচডিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.