প্যারামিটার তালিকা তৈরি করতে ব্যাশ স্ট্রিং কনটেনটেশন


12

এই টুকরো টুকরো দেওয়া:

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}

প্রতিধ্বনিটি প্রত্যাশিতভাবে PARMS স্ট্রিংটি দেখায়, কোনও ত্রুটি প্রদর্শিত হয় না, তবে rsync নীরবে এমনভাবে কাজ করে যে + + দ্বারা যুক্ত বিকল্পগুলি উপস্থিত ছিল না। তবে এটি প্রত্যাশার মতো কাজ করে:

PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}

আমি অনুমান করি যে আমি বাশ উদ্ধৃতি (সর্বদা সেগুলিতে সমস্যা ছিল) দিয়ে কিছু আঁকিয়েছি, তবে স্ট্রিংটি সঠিকভাবে নির্মিত হয়েছে বলে মনে হলেও ঠিক কী এবং কেন বিকল্পগুলি উপেক্ষা করা হয়েছে তা নিশ্চিত নয় not


1
echo "$PARMS"এবং rsync "${PARMS}"...
জেসনওয়ারিয়ান

bashএটি কোনও পরিবর্তন ছাড়াই ৪.২.২৫ সংস্করণ সহ আমার জন্য কাজ করে ।
অ্যান্থন

উত্তর:


17

এর মধ্যে পার্থক্য রয়েছে:

PARMS+="... --exclude='.git'"

এবং

... --exclude='.git'

প্রথমটিতে, একক উদ্ধৃতিগুলি নিজের ভিতরে উদ্ধৃতিগুলি থাকে, সুতরাং তারাrsync আর্গুমেন্ট হিসাবে দেওয়া বিকল্প পাঠ্যে আক্ষরিক অর্থে উপস্থিত হয় । rsyncযার মান হ'ল একটি যুক্তি পায় --exclude='.git'। দ্বিতীয়টিতে, একক উদ্ধৃতিগুলি শেলটি দ্বারা লেখার সময় ব্যাখ্যা করা হয়, কারণ সেগুলি নিজের ভিতরে উদ্ধৃত হয় না এবং rsyncদেখতে পায় --exclude=.git

এক্ষেত্রে আপনার কোনও একক উদ্ধৃতি লাগবে না - .gitএটি একটি বিশেষ বৈধ শেল শব্দ, যার কোনও বিশেষ অক্ষর নেই, তাই আপনি এটি আক্ষরিক অর্থে ব্যবহার করতে পারেন।

এই ধরণের জিনিসটির জন্য ভাল তবে একটি অ্যারে :

PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"

এটি আপনার কমান্ডটি পৃথক শব্দ হিসাবে তৈরি করে, আপনি অ্যারে লাইনটি লেখার সময় যে কোনও উদ্ধৃতিটি ব্যাখ্যা করতে চান তা দিয়ে। অ্যারের প্রতিটি এন্ট্রি পৃথক আর্গুমেন্ট হিসাবে "${PARMS[@]}"প্রসারিত হয়, এমনকি যুক্তিটিতে যদি এর মধ্যে বিশেষ অক্ষর বা স্পেস থাকে, তাই rsyncআপনি যা লিখেছেন তা আপনি কী লিখেছেন তা দেখুন।


bashশব্দ বিভাজন পরে ${PARMS}প্রসারিত হয়েছে সঞ্চালিত । সুতরাং একক উদ্ধৃতি শেল দ্বারা ব্যাখ্যা করা হয়েছিল।
cuonglm

2
চেষ্টা করে দেখুন! আমি করেছিলাম. উদ্ধৃতিগুলি রয়ে গেছে, এবং যদি তাদের মধ্যে ফাঁকা স্থান থাকে তবে সেগুলি যেভাবেই বিভক্ত পয়েন্ট।
মাইকেল হোমার

@Gnouc: ব্যাশ man পৃষ্ঠা থেকে: "উক্তি অপসারণ: পূর্ববর্তী প্রসারণও পর অক্ষরের সব unquoted ঘটনার \ , 'এবং "। যে উপরোক্ত প্রসারণও সরিয়ে ফেলা হয় এক থেকে করা হয়নি" "উপরের বিস্তৃতি" এর মধ্যে প্যারামিটার সম্প্রসারণ অন্তর্ভুক্ত যা এর সম্প্রসারণ সম্পাদন করে ${PARMS}
ক্যামহ

ধন্যবাদ। সুতরাং আমি বুঝতে পারি যে সেক্ষেত্রে ডাবলগুলির মধ্যে একক উদ্ধৃতিগুলি বাদ দেওয়া কাজ করবে তবে সম্পূর্ণতার জন্য - যদি আমাকে কিছু বিশেষ চরিত্রের উদ্ধৃতি দেওয়ার প্রয়োজন হয় এবং আপনার উত্তরোত্তর পদ্ধতির ব্যবহার করতে না চান তবে কী হবে?
neuviemeporte

যদি আপনার বিশেষ অক্ষরগুলি IFS(সাধারণত, সাদা স্থান) এর অংশ না হয় , আপনার সেগুলি উদ্ধৃত করার দরকার নেই। যদি সেগুলি হয় তবে আপনি ভাগ্য থেকে দূরে না থাকলে যদি আপনি একসাথে কিছু হ্যাক না করেন eval- এটি সাধারণভাবে কিছুটা অপব্যবহার, এবং অ্যারেগুলি এটির সাথে ডিল করার সঠিক উপায়।
মাইকেল হোমার

2

@ মিশেল হোমার এর উত্তর ছাড়াও , আপনি bash functionওয়াল ফাংশনটি ব্যবহার করতে পারেন :

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'

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