দৃ Building়ভাবে নির্মাণের পথ Building


16

বলুন শেল স্ক্রিপ্টে আমার বেশ কয়েকটি ভেরিয়েবল রয়েছে (যেমন zsh এ):

FOLDER_1, FOLDER_2, etc.

এই ভেরিয়েবলগুলি নীচে থেকে নেমে আসা ফোল্ডারগুলি উল্লেখ করে /। উদাহরণস্বরূপ, যদি আমার কোনও পথ থাকে/home/me/stuff/items

ভেরিয়েবলগুলি হবে:

FOLDER_1='home'
FOLDER_2='me'
FOLDER_3='stuff'

এখন, বলুন যে আমি ভেরিয়েবলগুলি যুক্ত করে সংশ্লিষ্ট পাথটি আবার তৈরি করতে চাই। একটি সম্ভাব্য উপায় হ'ল পথটি নিম্নরূপভাবে তৈরি করা:

PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/

যাইহোক, বলুন যে কিছু ভেরিয়েবলগুলি FOLDER_iপিছনে ফোর্ড স্ল্যাশ নিয়ে আসে, অন্যরা (এবং আমরা জানি না যে) উদাহরণস্বরূপ

FOLDER_1='home'
FOLDER_2='stuff/'
FOLDER_3='items'

আমার প্রশ্ন: আমি কীভাবে দৃ rob়ভাবে পথটি তৈরি করতে পারি? (যেমন ডাবল স্ল্যাশ এড়ানো এবং তাদের যেখানে হওয়া দরকার সেখানে যুক্ত করুন)।

আমি ভেবেছিলাম এটি করার একটি উপায় হ'ল /জোড় পরিবর্তনকের মধ্যে সর্বদা যুক্ত করা এবং এর সাথে কোনও সদৃশ মুছে ফেলা sed, তবে আমি এটি কাজ করতে পারি না (আমি নিশ্চিত না যে আমি /সঠিকভাবে পরিচালনা করছি sed) am

এছাড়াও, আমি চাকা পুনরায় উদ্ভাবন করছি ? (অর্থাত্ কোনও বিল্ট-ইন রয়েছে যা ইতিমধ্যে এটি করে?)।

শেষ পর্যন্ত, যদি ভেরিয়েবলগুলি একটি অ্যারেতে থাকে , উদাহরণস্বরূপ FOLDERS, লুপ না করে এটি করা কি সম্ভব? (বা বিকল্পভাবে, লুপিং দ্বারা কিন্তু FOLDERSঅ্যারেতে কত রয়েছে তা না জেনে )।

উত্তর:


12

আপনি printfএকটি অ্যারে দিয়ে ব্যবহার করতে পারেন :

parts=("$FOLDER_1" "$FOLDER_2" "$FOLDER_3");
printf '/%s' "${parts[@]%/}"
# Use "printf -v path" to save it into a variable called "path" instead of printing it

%অপারেটর স্ট্রিং trailing এই ক্ষেত্রে ট্রিম /। এটি প্রয়োগ করে parts[@], এটি প্রতিটি অ্যারে সদস্যকে পৃথকভাবে ছাঁটাই করে দেয়।

এই printfকৌশলটি বোঝার মূল চাবিকাঠি , এটি থেকে কিছুটা এই man 1 printf: "আর্গুমেন্টগুলি পূরণ করার জন্য ফর্ম্যাট স্ট্রিংটি প্রায়শই প্রয়োজন হিসাবে পুনরায় ব্যবহার করা হয়।"


একক %পদ্ধতিটি কোয়েস্টনে উল্লিখিত একক পেছনের স্ল্যাশের জন্য কাজ করে। যখন একাধিক স্ল্যাশ থাকে তখন তার জন্য ${parts[@]%%/*}কাজ করে। এখানে স্ল্যাশ ইস্যুতে আরও কিছু তথ্যের একটি লিঙ্ক: ইউনিক্স পথে ডাবল স্ল্যাশ বলতে কী বোঝায়? 'সিডি দির / সাবডির // বৈধ ...
পিটার.ও

2
@fered: /*এই ক্ষেত্রে না না মানে শূন্য বা তার বেশি স্ল্যাশ স্ল্যাশ অক্ষরের যে কোন সংখ্যার দ্বারা অনুসরণ, বরং। তার মানে যদি আপনার পথটি একটি স্ল্যাশ দিয়ে শুরু হয়, ফলাফলটি খালি স্ট্রিং হবে!
l0b0

উদাহরণ হিসাবে আমি বিবেচনা করেছি, কেবল সেখানে পিছনে পিছনে ছিটিয়ে থাকবে। তবে, শীর্ষস্থানীয় স্ল্যাশ (এস) এর সম্ভাব্যতার সাথে খাপ extglobshopt -s extglob; ${parts[@]%%/+(/)}
খাইয়ে নিতে, ব্যাশের

15

এর সহজ উত্তর হ'ল উদ্বেগ বন্ধ করা এবং একাধিক স্ল্যাশ পছন্দ করা। একাধিক স্ল্যাশের একই প্রভাব রয়েছে একক স্ল্যাশের মতো (ব্যতীত //কয়েকটি পদ্ধতির সাথে শুরু হওয়া পথটির আলাদা অর্থ রয়েছে; উইন্ডোজে ইউনিক্স এমুলেশন স্তরগুলিই কেবলমাত্র আমি নাম বলতে পারি)। এটি ডিজাইনের দ্বারা, এবং একাধিক স্ল্যাশ সম্পর্কে চিন্তা না করেই ফাইলের নামগুলি একত্রিত করতে সক্ষম হওয়াই সেই নকশার সিদ্ধান্তের একটি প্রধান অংশ ছিল।

অ্যারে উপাদানগুলিতে যোগ দিতে, zsh এ, আপনি j প্যারামিটার সম্প্রসারণ পতাকা ব্যবহার করতে পারেন ।

dir=${(j:/:)FOLDERS}

আপনি নকল স্ল্যাশগুলি যখন সেখানে পৌঁছেছেন তা স্কুইশ করতে পারেন তবে এটি নিখুঁতভাবে প্রসাধনী।

setopt extended_glob
dir=${${(j:/:)FOLDERS}//\/\/##/\/}

Ksh এবং bash এ আপনি $IFSবিভাজক হিসাবে প্রথম অক্ষরটি ব্যবহার করে একটি অ্যারেতে যোগ দিতে পারেন । এরপরে আপনি সদৃশ স্ল্যাশগুলি স্কুইশ করতে পারেন। ব্যাশে, আপনাকে shopt -s extglobনীচের স্নিপেটের শেষ লাইনে ksh গ্লোবগুলি সক্ষম করতে হবে ।

IFS=/
dir="${FOLDERS[*]}"
unset IFS
dir=${dir//\/+(\/)//}

3

আপনার জন্য কিভাবে sedকাজ করছে না? মনোযোগ sed 's|/\+|/|g'দেওয়ার পরে বা এর sed 's|/||g'আগে চেষ্টা করুন ।


1

bash 4প্রসারিত গ্লোববিং প্রবর্তিত, যা প্যারামিটার প্রতিস্থাপনের সাথে নিয়মিত প্রকাশের মিলটি সক্ষম করে ${var....}... এটি ডিফল্টরূপে বন্ধ হয়। আপনার স্ক্রিপ্টের জন্য এটি সক্ষম করতে, কেবল শেল বিকল্পটি এক্সট্লোব সেট করুন ...

ধরে নিচ্ছি যে ir দির ==/home/me/////////stuff//items

shopt -s extglob; dir="${dir//+(\/)//}"

ফলে মান $ Dir

/home/me/stuff/items  

এখানে করণীয় এবং কী না- এর কয়েকটি উদাহরণ রয়েছে - বাশ প্রসারিত গ্লোববিং

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