শেলটিতে স্ট্রিংয়ের শেষ চরিত্রটি কীভাবে পাবেন?


125

আমি একটি স্ট্রিংয়ের শেষ চরিত্রটি পেতে নিম্নলিখিত লাইনগুলি লিখেছি:

str=$1
i=$((${#str}-1))
echo ${str:$i:1}

এটি এর জন্য কাজ করে abcd/:

$ bash last_ch.sh abcd/
/

এটি এর জন্য কাজ করে নাabcd* :

$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh

এটি বর্তমান ফোল্ডারে ফাইলগুলি তালিকাভুক্ত করে

উত্তর:


96

আপনার ভেরিয়েবলগুলি উদ্ধৃত করার জন্য এটির একটি কারণ:

echo "${str:$i:1}"

অন্যথায়, বাশ চলকটি প্রসারিত করে এবং এই ক্ষেত্রে প্রিন্ট আউট করার আগে গ্লোব্বিং করে। স্ক্রিপ্টের প্যারামিটারটি উদ্ধৃত করা আরও ভাল (যদি আপনার কাছে ম্যাচের ফাইলের নাম থাকে):

sh lash_ch.sh 'abcde*'

বাশ রেফারেন্স ম্যানুয়ালটিতে বিস্তারের ক্রমও দেখুন । ফাইলের নাম বিস্তারের আগে চলকগুলি প্রসারিত হয়।

শেষ চরিত্রটি পেতে আপনাকে কেবল -1সূচক হিসাবে ব্যবহার করা উচিত যেহেতু নেতিবাচক সূচকগুলি স্ট্রিংয়ের শেষে থেকে গণনা করা হয়:

echo "${str: -1}"

কোলন ( :) এর পরে স্থানটি প্রয়োজনীয়।

এই পদ্ধতির স্থান ছাড়া কাজ করবে না।


62
বিটিডাব্লু, নেতিবাচক সূচকগুলি ডান থেকে গণনা করা যায়, তাই "${1: -1}"যথেষ্ট।
চোরোবা

7
আপনার এখানে আনুষ্ঠানিক সমাধান হিসাবে মন্তব্য করা উচিত, মন্তব্যগুলিতে নয়।
বিএমডাব্লু

এফওয়াইআই: আপনি "ওয়ান-লাইনার" হিসাবে এটিও করতে পারেন echo "${str:$((${#str}-1)):1}"। এটি আপনাকে পিছনে ফিরে আসা অক্ষরগুলিকেও আলাদা করতে দেয়। আমার জন্য এই কাজটি bash v4.1.0 (1)
স্যাক্সডাডি

16
@ চোরোবার উত্তর: জঘন্য স্থানটি নোট করুন! এটি সর্বদা আমাকে ট্রিপ করে: "${1:-1}কাজ করে না "!
mxMLnkn

192

প্রতি @ স্পিরিয়াল অনুসারে, ভেরিয়েবলগুলি উদ্ধৃত করা গুরুত্বপূর্ণ তবে মন্তব্যগুলিতে হাতে থাকা প্রশ্নের সহজ সরল পদ্ধতির সন্ধান করার আগে আমি 5 বারের মতো এই পোস্টটি পড়েছি ...

str='abcd/'
echo "${str: -1}"

আউটপুট: /

str='abcd*'
echo "${str: -1}"

আউটপুট: *

এই উপরের অংশগ্রহনকারী প্রত্যেককে ধন্যবাদ; আমি যথাযথভাবে থ্রেড জুড়ে +1 যোগ করেছি!


25
এনবি: ভিতরে স্থানটি নোট করুন, স্থান ${std: -1}ব্যতীত এটি কাজ করবে না। আমি এটিতে ছুটে এসেছি এবং ${std:~0}এটিও দেখতে পেয়েছে (স্থান সহ বা ছাড়াই) কাজ করে। যদিও এটি নথিভুক্ত আচরণটি কিনা তা নিশ্চিত নই, আমি এটি সন্ধান করার জন্য বিরক্ত করিনি।
বার্ট

4
এটি নথিভুক্ত করা হয়। ম্যান বাশ বলেছেন: গাণিতিক এক্সপ্রেশনগুলি - এর সাথে শুরু করে অবশ্যই পূর্ববর্তী থেকে হোয়াইটস্পেসের মাধ্যমে পৃথক করা উচিত: ইউজ ডিফল্ট
মানগুলির

3
এটা দুর্দান্ত, ভাগ করে নেওয়ার জন্য ধন্যবাদ। বেস ম্যানপেজটি পড়ার জন্য প্রায় অপ্রতিরোধ্য, যদিও আমি বেশ কয়েকবার সেখানে এসেছি। আমি মনে করি তারা শেল স্ক্রিপ্টিং ললকে ঘিরে একটি কলেজ কোর্স করতে পারে।
কুইকশিফ্টিন

3
.shকোনও ভেরিয়েবলের জন্য পুনরুদ্ধার করা অক্ষরটি নির্ধারণের চেষ্টা করার সময় এই সমাধানটি কোনও স্ক্রিপ্টে কাজ করে না । উদাহরণস্বরূপ, declare LAST=$(echo "${str: -1}") এর ফলে বাজে লাল বারটি সিন্ট্যাক্স ত্রুটিটি শুরু হতে শুরু করবে:
krb686

3
যদি সম্পাদক সিনট্যাক্স চেকিং সেই স্থানটি পছন্দ না করে${str:0-1}
ttt

36

আমি জানি এটি একটি খুব পুরানো থ্রেড, তবে আমার কাছে কোনটিই সবচেয়ে পরিষ্কার উত্তরটি উল্লেখ করেন নি:

echo -n $str | tail -c 1

নোটটি -nঠিক তাই ইকোটি শেষে কোনও নতুন লাইন অন্তর্ভুক্ত করে না।


15
এমনকি $ {str: -1 than এর চেয়ে ক্লিনার হওয়ার কাছাকাছি নয়
শে

8
এটি ক্লাশ কারণ এটি কোনও ব্যাশ-ইসমের উপর নির্ভর করে না, সুতরাং এটি কোনও পসিক্স শেলের সাথে কাজ করবে।
জন একেনবেরি

সর্বাধিক "বাশিস্ট" কী? "{{str: -1}" এবং ... সবচেয়ে পরিষ্কার কি? "{{str: -1}" বাশ হ'ল বেশ্ট! :-)
রজার

যে কোনও বড় ফাইলটিতে শেষ অক্ষরগুলি মুদ্রণের চেষ্টা করার জন্য, এটি আমার পক্ষে কাজটি করেছে: বিড়াল ব্যবহারকারী / ফোল্ডার / file.json | লেজ -c 1 আপনি মুদ্রণ করতে চান এমন অক্ষরের সংখ্যার সাথে আপনি 1 টি প্রতিস্থাপন করতে পারেন।
দিয়েগো সেরানানো

5

অ্যাজক স্ক্রিপ্ট ব্যবহার করে অন্য একটি সমাধান:

শেষ 1 চর:

echo $str | awk '{print substr($0,length,1)}'

সর্বশেষ 5 অক্ষর:

echo $str | awk '{print substr($0,length-5,5)}'

1
ওপি যা চেয়েছিল তা নয়, তবে এটিই সেরা সমাধান যা আমি কোনও ফাইলের সাথে ব্যবহার করতে পেলাম। বেশিরভাগ অন্যান্য পন্থাগুলি এতে কোনও ফাইলকে ক্যাট-আইং-এ কাজ করবে না, যেমন: cat file | awk '{print substr($0,length,1)}'ধন্যবাদ!
এক্সমার

4

সপ্তাহের দিন:

${str:${#str}-1:1}

এখন:

echo "${str:${#str}-1:1}"

1
কেন আপনি দুটি জোড়া বন্ধনী ব্যবহার করেন? এছাড়াও, 4.2 সাল থেকে আপনাকে নেতিবাচক অফসেট, যেমন quickshiftin এর উত্তর দেখানো ব্যবহার করতে পারেন: echo "${str: -1}"যথেষ্ট (মধ্যে স্থান মন :এবং -)।
gniourf_gniourf

গাণিতিক ক্রিয়াকলাপের জন্য দুই জোড়া বন্ধনী ব্যবহার করা হয়
এডুয়ার্ডো কুওমো

না। দয়া করে ম্যানুয়ালটির প্রাসঙ্গিক অংশটি দেখুন যেখানে আপনি পড়বেন: দৈর্ঘ্য এবং অফসেটটি পাটিগণিতের এক্সপ্রেশন ( শেল অরিথমেটিক দেখুন ); অতএব আপনি ইতিমধ্যে শেল পাটিগণিতের মধ্যে রয়েছেন এবং কোনও কোনও বন্ধনী প্রয়োজন নেই। এছাড়া যদি তুমি কি বললে সত্য, এটি আরো যৌক্তিক একটি আছে হবে গাণিতিক সম্প্রসারণ সঙ্গে $((...))
gniourf_gniourf

@gniourf_gniourf আপনি ঠিক বলেছেন! আমি এখন আপনার আগের প্রশ্ন বুঝতে পারি। উত্তর আপডেট হয়েছে
এডুয়ার্ডো কুইমো

4

এ পর্যন্ত প্রতিটি উত্তর প্রশ্নের মধ্যে "শেল" শব্দটি বোঝায় বাশের সমতুল্য।

স্ট্যান্ডার্ড বোর্ন শেলটিতে কেউ কীভাবে এটি করতে পারে:

printf $str | tail -c 1

1
echo -nযেমন ব্যবহারকারীর প্রস্তাবিত 39৩৩৩৯৯৯ সমস্যা এড়ানো যায় যখন $strবিশেষ বিন্যাসের অক্ষর থাকে।
কনরাড মায়ার

-nসুইচ একটি bashism হয়। এটি ড্যাশ ইত্যাদির মতো স্ট্যান্ডার্ড বোর্ন শেলটিতে কাজ করবে না ... যা আমার উত্তরের মূল বিষয় ছিল।
phep

1
বেশ বাশিজম নয়, তবে পসিক্স বুঝতে পারে এটি বাস্তবায়ন সংজ্ঞায়িত ("যদি প্রথম অপারেন্ডটি -n হয়, বা যদি কোনও অপারেন্ডে <ব্যাকস্ল্যাশ> অক্ষর থাকে তবে ফলাফলগুলি বাস্তবায়ন-সংজ্ঞায়িত হয়")। পরিবর্তে আপনার উত্তরটি printf "%s" "$str" | ...:-) দিয়ে স্থির করা যেতে পারে ।
কনরাড মেয়ার

4

চেষ্টা করুন:

"${str:$((${#str}-1)):1}"

যেমন:

someone@mypc:~$ str="A random string*"; echo "$str"
A random string*
someone@mypc:~$ echo "${str:$((${#str}-1)):1}"
*
someone@mypc:~$ echo "${str:$((${#str}-2)):1}"
g

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