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


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.