it-swarm.asia

كيفية الحصول على الحرف الأخير من سلسلة في قذيفة؟

لقد كتبت الأسطر التالية للحصول على الحرف الأخير من سلسلة:

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

يسرد الملفات في المجلد الحالي .

101
metaphy

هذا أحد الأسباب التي تجعلك بحاجة إلى اقتباس متغيراتك:

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

بخلاف ذلك ، تقوم bash بتوسيع المتغير وفي هذه الحالة تتخطى قبل الطباعة. من الأفضل أيضًا اقتباس المعلمة إلى البرنامج النصي (في حالة وجود اسم ملف مطابق):

sh lash_ch.sh 'abcde*'

راجع أيضًا ترتيب التوسعات في دليل مرجع bash . يتم توسيع المتغيرات قبل توسيع اسم الملف.

57
perreal

لكلperreal ، يعد اقتباس المتغيرات أمرًا مهمًا ، ولكن لأنني قرأت هذا المنشور مثل 5 مرات قبل أن أجد طريقة أبسط للسؤال المطروح في التعليقات ...

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

الإخراج: /

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

الإخراج: *

شكرا لكل من شارك في هذا أعلاه ؛ لقد أضفت 1+ بشكل صحيح في جميع أنحاء الموضوع!

172
quickshiftin

أعلم أن هذا موضوع قديم جدًا ، لكن لم يذكره أحد هو أنظف إجابة:

echo -n $str | tail -c 1

لاحظ أن -n هو فقط بحيث لا يحتوي الصدى على سطر جديد في النهاية.

24
user5394399

محاولة:

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

على سبيل المثال:

[email protected]:~$ str="A random string*"; echo "$str"
A random string*
[email protected]:~$ echo "${str:$((${#str}-1)):1}"
*
[email protected]:~$ echo "${str:$((${#str}-2)):1}"
g
5
mark_infinite

سطر واحد:

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

الآن:

echo "${str:${#str}-1:1}"
3
Eduardo Cuomo

كل إجابة حتى الآن تعني أن كلمة "Shell" في السؤال تعادل Bash.

هذه هي الطريقة التي يمكن للمرء القيام بها في بورن شل القياسية:

printf $str | tail -c 1
3
phep

حل آخر باستخدام البرنامج النصي awk:

آخر 1 تشار:

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

آخر 5 أحرف:

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