bash - نظرا - كيف يمكنني إزالة ملحق اسم الملف في البرنامج النصي shell؟



منذ مدة (6)

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

echo $filename | rev | cut -f 2- -d '.' | rev

ما هو الخطأ في التعليمة البرمجية التالية؟

name='$filename | cut -f1 -d'.''

كما هو ، أحصل على $filename | cut -f1 -d'.' الحرفي $filename | cut -f1 -d'.' $filename | cut -f1 -d'.' ولكن إذا أزلت الاقتباسات لا أحصل على أي شيء. في الوقت نفسه الكتابة

"test.exe" | cut -f1 -d'.'

في قذيفة يعطيني الإخراج أريد ، test . أعرف بالفعل أن $filename تم تعيينه بالقيمة الصحيحة. ما أريد القيام به هو تعيين متغير اسم الملف بدون الامتداد.


Answer #1

إذا كنت تعرف الامتداد ، فيمكنك استخدام basename

$ basename /home/jsmith/base.wiki .wiki
base

Answer #2

يجب أن تستخدم صيغة بناء الجملة $(command) عندما تريد تنفيذ أمر في البرنامج النصي / الأمر.

لذا سيكون خطك

name=$(echo "$filename" | cut -f 1 -d '.')

شرح الكود:

  1. echo الحصول على قيمة المتغير $filename وإرسالها إلى الإخراج القياسي
  2. ثم نتناول الإخراج وننقله إلى أمر cut
  3. فإن cut استخدام. كمحدد (يعرف أيضًا بالفاصل) لقص السلسلة إلى مقاطع -f قمنا باختيار أي مقطع نريد أن نحصل عليه في الإخراج
  4. ثم سوف تحصل على إحالة الأمر $() الإخراج وإرجاع قيمته
  5. سيتم تعيين القيمة التي تم إرجاعها للمتغير name المسمى

لاحظ أن هذا يعطي جزء من المتغير حتى الفترة الأولى . :

$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello

Answer #3

يمكنك أيضًا استخدام توسيع المعلمة:

$ filename=foo.txt
$ echo "${filename%.*}"
foo

Answer #4
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}

المخرجات:

/tmp/foo.bar.gz /tmp/foo.bar

لاحظ أنه تتم إزالة الملحق الأخير فقط.


Answer #5
file1=/tmp/main.one.two.sh
t=$(basename "$file1")                        # output is main.one.two.sh
name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e 's/\.[^.]*$//')     # output is main.one.two

استخدام أيهما تريد. هنا أفترض أن الماضي . (نقطة) متبوعًا بالنص هو امتداد.





gnu-coreutils