ডিরেক্টরি পাথের শেষ স্ল্যাশটি কীভাবে ফেলা যায়?


17

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা একটি যুক্তি হিসাবে একটি ডিরেক্টরি প্রয়োজন। আমি দুটি ফর্মটি সমর্থন করতে চাই: একটির মতো

a/b/c

(শেষে কোনও স্ল্যাশ নেই) এবং অন্যটি এর মতো

 a/b/c/

(শেষে স্ল্যাশ হয়েছে)।

আমার প্রশ্ন: দুটি ফর্মের যে কোনও একটি দেওয়া, আমি কীভাবে কেবল প্রথম ফর্মটি অপরিবর্তিত রাখতে পারি এবং দ্বিতীয় ফর্মের শেষ স্ল্যাশটিকে এটিকে প্রথম ফর্মে রূপান্তর করতে পারি।


2
এটি যে কোনও সমস্যা হতে পারে তা নয় - শুরুতে বাদে অন্য কোথাও একটি দ্বৈত স্ল্যাশ একক স্ল্যাশের সমতুল্য, সুতরাং তাদের ব্যবহার করে যোগ দেওয়ার বিষয়ে চিন্তা করবেন না /
মুড়ু

@ মুরু আমি এর আগে জানতাম না :)।
ইউলং এও


1
@muru একটি যেমন একটি সিমবলিক লিঙ্ক অভিনয় এবং ডিরেক্টরিটি অভিনয় মধ্যে পার্থক্য এটি পয়েন্ট অথবা উৎস আর্গুমেন্ট হিসাবে, শেষে স্ল্যাশ একটি পার্থক্য করতে পারেন rsync
গিলস

@ গিলস সত্যই, তবে আপনি দেখতে পাচ্ছেন, আমি পথে যোগ দেওয়ার কথা বলছি।
মুড়ু

উত্তর:


23
dir=${1%/}

স্ক্রিপ্টের প্রথম প্যারামিটারটি নেবে এবং যদি সেখানে থাকে তবে একটি পিছনের স্ল্যাশ সরিয়ে ফেলবে।


12

ট্রেলিং স্ল্যাশ যদি থাকে তবে তা অপসারণ করতে আপনি সমস্ত পসিক্স-স্টাইলের শেলগুলিতে উপস্থিত প্রত্যয় অপসারণ প্যারামিটার সম্প্রসারণ কন্সট্রাক্টটি ব্যবহার করতে পারেন :

x=${x%/}

কয়েকটি জটিলতা রয়েছে। এটি কেবলমাত্র একটি একক স্ল্যাশ সরিয়ে দেয়, সুতরাং আপনি যদি শুরু করে থাকেন a/b/c//তবে এখনও স্ল্যাশ দিয়ে শেষ করবেন। তদতিরিক্ত, যদি আসল পথটি ছিল /তবে আপনার স্ল্যাশ রাখতে হবে। এখানে আরও জটিল সমাধান যা এই কেসগুলি যত্ন করে:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

বিকল্পভাবে, ksh বা বাশ পরে shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

মনে রাখবেন যে অনেক ক্ষেত্রে, এটি পিছনে স্ল্যাশ রয়েছে তা বিবেচনা করে না। আর্গুমেন্টটি যদি কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক হয় তবে তা বিবেচ্য হয়: একটি পিছনে স্ল্যাশ সহ আর্গুমেন্টটি ডিরেক্টরিটি মনোনীত করে, যেখানে কোনও পিছনে স্ল্যাশ না করে যুক্তিটি প্রতীকী লিঙ্কটি নিজেই ডিজাইন করে। এটি কয়েকটি অন্যান্য প্রোগ্রামের সাথেও গুরুত্বপূর্ণ, উদাহরণস্বরূপ উত্সের যুক্তিটি rsyncএকটি পিছনের স্ল্যাশের উপস্থিতির উপর নির্ভর করে আলাদা আচরণ করা হয়।


2

realpathপ্রদত্ত পথটি সমাধান করে। অন্যান্য জিনিসগুলির মধ্যে এটি পিছনে স্ল্যাশগুলিও সরিয়ে দেয়। -sনিম্নলিখিত সিলেঙ্কগুলি রোধ করতে ব্যবহার করুন

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.