লিনাক্স শেল স্ট্রিংয়ে%% কী করে?


28

লিনাক্স শেল-এ,% কী করে:

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done

4
যতবার আমি এটি সন্ধান করি, আমি সাধারণত বাশ ম্যান পৃষ্ঠার ডান বিভাগটি সন্ধান করে %%বা খুঁজে পাই ##, কারণ এটি স্মরণীয় এবং দ্রুত সঠিক বিভাগটি খুঁজে পেতে যথেষ্ট বিরল। man bash /##
— পিটার কর্ডেস

3
@ পিটারকর্ডস আমি সর্বদা এটি "সর্বদা 5% দ্বারা স্মরণ করি তাই% শেষ হয় এবং এভাবে শেষ থেকে কেটে যায় And তবে কখনও কখনও আমি এমনকি এটি এক মিশ্রিত…
— glglgl

2
@glglgl: ইউএসএ-র একটি সাধারণ কীবোর্ডে #তত্ক্ষণাত বাম দিকে $এবং %তত্ক্ষণাত ডানদিকে পৌঁছে যায়। কোন স্মৃতিচারণের প্রয়োজন নেই --- কেবল নীচে দেখুন। (এই প্রতীকগুলি কেন বেছে নেওয়া হয়েছিল তার সম্ভবত অন্তত অংশ part)
— কেভিন জে চেজ

@ কেভিনজে.চেজ বিশ্বব্যাপী প্রত্যেকেরই একটি সাধারণ মার্কিন কীবোর্ড নেই। তবে প্রকৃতপক্ষে, একটি জার্মান কীবোর্ডে,% ঠিক-ঠিক তেমনি, এটি স্মৃতিচারণের জন্য একটি সূচনা হতে পারে।
— glglgl

উত্তর:


29

যখন %প্যাটার্নে ব্যবহৃত হয় তখন এর পিছনে থেকে মুছে যাওয়া সংক্ষিপ্ততম ঘটনার সাথে সাথে ${variable%substring}সামগ্রীটি ফিরে আসবে ।variablesubstringvariable

এই ফাংশনটি ওয়াইল্ডকার্ড নিদর্শনগুলিকে সমর্থন করে - এজন্যই তারা শূন্য বা আরও বেশি চরিত্রের জন্য সাবটাইট হিসাবে তারকা (তারকাচিহ্ন) গ্রহণ করে।

এটি উল্লেখ করা উচিত যে এটি বাশ নির্দিষ্ট - অন্যান্য লিনাক্স শেলগুলি প্রয়োজনীয়ভাবে এই ফাংশনটি ধারণ করে না।

আপনি যদি বাশে স্ট্রিং ম্যানিপুলেশন সম্পর্কে আরও জানতে চান তবে আমি এই পৃষ্ঠাটি পড়ার পরামর্শ দিচ্ছি । অন্যান্য সহজ কাজগুলির মধ্যে এটি - উদাহরণস্বরূপ - কী করে %%তা ব্যাখ্যা করে :)

সম্পাদনা: আমি যে যখন এটি প্যাটার্ন ব্যবহৃত উল্লেখ করতে ভুলে গেছি $((variable%number))বা চরিত্র ফরম অপারেটরের যেমন কাজ করবে। ডেভিডপস্টিলের উত্তরে আরও সুনির্দিষ্ট ডকুমেন্টেশন লিঙ্ক রয়েছে।$((variable1%$variable2))%

যখন %বিভিন্ন প্রসঙ্গে ব্যবহৃত হয়, এটি কেবল নিয়মিত চরিত্র হিসাবে স্বীকৃত হওয়া উচিত।


2
অপারেটর নিয়মিত অভিব্যক্তি নয়, ওয়াইল্ডকার্ড নিদর্শনগুলিকে সমর্থন করে।
— বাগানের মাথায়

উল্লিখিত গার্ডেনহেডের মতো - এটি নিয়মিত অভিব্যক্তি নয়, গ্লোব নিদর্শনগুলিকে সমর্থন করে। নিয়মিত অভিব্যক্তিতে একটি তারকা মানে শূন্য বা পূর্বের চরিত্রের বেশি।
— slebetman

5
আপনি যে লিঙ্কটি লিঙ্ক করেছেন সেটি বেশিরভাগ ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জ ব্যবহারকারীদের দ্বারা প্রস্তাবিত নয় । আমি পরিবর্তে উওলজ বাশ গাইডের প্রস্তাব দিই ।
— ওয়াইল্ডকার্ড

3
প্রিফিক্স এবং প্রত্যয় অপসারণ অপারেটরগুলি মানসম্পন্ন , তাই shকেবল কোনও বাশ নয়, কোনও- সামঞ্জস্যপূর্ণ শেলটিতে সেগুলি ব্যবহারযোগ্য হবে । (যদিও সম্ভবত না cshএবং মত)।
— ilkkachu

1
আর একটি প্রসঙ্গে যা %ব্যবহৃত হয় সেটি হ'ল ফরমেট স্পেসিফায়ারগুলিতে printf।
— পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

9

বাশ রেফারেন্স ম্যানুয়াল: শেল প্যারামিটার সম্প্রসারণ

${parameter%word}
${parameter%%word}

শব্দ মাত্র ফাইলের নাম সম্প্রসারণ হিসেবে একটি প্যাটার্ন উত্পাদন করতে প্রসারিত করা হয়। যদি প্যাটার্নটি প্যারামিটারের বর্ধিত মানের একটি অনুবর্তী অংশের সাথে মেলে , তবে প্রসারণের ফলাফলটি হ'ল সংক্ষিপ্ত মিলের প্যাটার্ন ( কেস) বা দীর্ঘতম মিলিত প্যাটার্ন ( কেস) মোছার সাথে পরামিতির মান । যদি প্যারামিটার হয় বা প্যাটার্ন অপসারণ অপারেশন প্রতিটি পজিশনাল প্যারামিটারের পরিবর্তে প্রয়োগ করা হয়, এবং প্রসারিত ফলাফল ফলাফল list তাহলে প্যারামিটার হয় একটি অ্যারের পরিবর্তনশীল সঙ্গে subscripted বা‘%’‘%%’‘@’‘*’,‘@’‘*’, প্যাটার্ন অপসারণ অপারেশন প্রতিটি ঘুরে অ্যারের প্রতিটি সদস্যের জন্য প্রয়োগ করা হয়, এবং প্রসারিত ফলাফল তালিকা।


2
% সহ এনবি কিছু প্যারামিটার বিস্তৃতি এমন প্যাসিক্স বৈশিষ্ট্য যা অনেক শেল সমর্থন করে।
— কোজিরো

7

পরীক্ষা-নিরীক্ষা করে আমি দেখতে পেলাম যে% এর পরে একটি ম্যাচ ফেলে দেওয়া হয়, যখন স্ট্রিংটি কোঁকড়ানো বন্ধনী (বন্ধনী বন্ধনী) এ আবদ্ধ থাকে।

বর্ণনা করা:

touch abcd         # Create file abcd

for file in ab*; do
 echo $file        # echoes the filename
 echo $file%       # echoes the filename plus "%"
 echo ${file%}     # echoes the filename
 echo "${file%}"   # echoes the filename
 echo
 echo "${file%c*}" # Discard anything after % matching c*
 echo "${file%*}"  # * is not greedy
 echo ${file%c*}   # Without quotes works too
 echo "${file%c}"  # No match after %, no effect
 echo $file%c*     # Without {} fails
done

এখানে ফলাফল:

abcd
abcd%
abcd
abcd

ab
abcd
ab
abcd
abcd%c*

7

লিনাক্স শেল ( bash) এ, কী করে %?

for file in *.png.jpg; do
  mv "$file" "${file%.png.jpg}.jpg"
done

এই বিশেষ ক্ষেত্রে, এটি %হ'ল প্যাটার্ন ম্যাচিং অপারেটর (নোট করুন এটি একটি মডুলো অপারেটরও হতে পারে )।


প্যাটার্ন ম্যাচিং অপারেটর

$ {var% $ প্যাটার্ন}, $ {var %% $ প্যাটার্ন}

${var%$Pattern}থেকে সরান $varকম অংশ $Patternযে ফিরে শেষ ম্যাচ $var।

${var%%$Pattern}থেকে সরান $varদীর্ঘতম অংশ $Patternযে ফিরে শেষ ম্যাচ $var।

উদাহরণ: পরামিতি প্রতিস্থাপনে প্যাটার্নের মিল

#!/bin/bash
# patt-matching.sh

# Pattern matching  using the # ## % %% parameter substitution operators.

var1=abcd12345abc6789
pattern1=a*c  # * (wild card) matches everything between a - c.

echo
echo "var1 = $var1"           # abcd12345abc6789
echo "var1 = ${var1}"         # abcd12345abc6789
                              # (alternate form)
echo "Number of characters in ${var1} = ${#var1}"
echo

echo "pattern1 = $pattern1"   # a*c  (everything between 'a' and 'c')
echo "--------------"
echo '${var1#$pattern1}  =' "${var1#$pattern1}"    #         d12345abc6789
# Shortest possible match, strips out first 3 characters  abcd12345abc6789
#                                     ^^^^^               |-|
echo '${var1##$pattern1} =' "${var1##$pattern1}"   #                  6789      
# Longest possible match, strips out first 12 characters  abcd12345abc6789
#                                    ^^^^^                |----------|

echo; echo; echo

pattern2=b*9            # everything between 'b' and '9'
echo "var1 = $var1"     # Still  abcd12345abc6789
echo
echo "pattern2 = $pattern2"
echo "--------------"
echo '${var1%pattern2}  =' "${var1%$pattern2}"     #     abcd12345a
# Shortest possible match, strips out last 6 characters  abcd12345abc6789
#                                     ^^^^                         |----|
echo '${var1%%pattern2} =' "${var1%%$pattern2}"    #     a
# Longest possible match, strips out last 12 characters  abcd12345abc6789
#                                    ^^^^                 |-------------|

# Remember, # and ## work from the left end (beginning) of string,
#           % and %% work from the right end.

echo

exit 0

উত্স পরামিতি সাবস্টিটিউশন


মডুলো অপারেটর

%

মডুলো বা মোড (একটি পূর্ণসংখ্যা বিভাগ অপারেশনের বাকী অংশটি দেয়)

bash$ expr 5 % 3
2

5/3 = 1, বাকি 2 সহ with

উত্স অপারেটর


হয়তো আমি বুঝেছি: এই ভালো জিনিস জন্য .*এবং %এটা যেহেতু অ লোভী হতে সংজ্ঞায়িত %%করে তোলে লোভী? সুতরাং প্রকৃতপক্ষে পুনরায় নামকরণের উদাহরণে এটি ব্যবহার করা উচিত কিনা তা বিবেচ্য নয় %বা %%এটি যদি mv "$file" "${file%.*png.jpg}.jpg"(* নোট করুন) ব্যবহার করে %% সমস্ত ফাইলের পুনরায় নামকরণ করে ঠিক .jpg, ডান?
— থমাস ভেলার

@ থমাস ওেলার আমি মনে করি এটি সঠিক। তবে আমি কোনও বাশ বিশেষজ্ঞ নই।
— ডেভিডপস্টিল

"সরান ... এর সংক্ষিপ্ত অংশ $Pattern" বলা ভুল কারণ $Patternউদাহরণটিতে ভেরিয়েবলটি সংজ্ঞায়িত করা হয় না, $varযখন করা ${var%Pattern}বা করা হচ্ছে তখন কেবল "প্যাটার্ন" লেখাটি সরানো হচ্ছে ${var%%Pattern}। হতে পারে এটি কেবল একটি টাইপো, তবে এটি tldp.org ভুল হওয়ার আরও একটি উদাহরণ। বাশগুইড বা ব্যাশ হ্যাকার্স উইকি উভয়ই অনেক ভাল রেফারেন্স ইমো।
— জন বি

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