Tam yoldan uzantı olmadan dosya adı nasıl ayıklanır?


10

İlk bash betiğimi düzeltmeye çalışıyorum ve bir noktada betiğe bir dosya adı aktarıldı $1. Uzantı olmadan dosya adını ayıklamak gerekiyor.
Şu anda, tüm uzantıların üç harf olduğunu varsayıyorum, bu yüzden dosya adını almak için son 4 karakteri kaldırdım:

a="${1:0:-4}"

Ancak %~n1Windows'ta olduğu gibi üçten fazla karakter içeren uzantılarla çalışabilmem gerekiyor .
Bağımsız değişkenlerden uzantı olmadan dosya adını çıkarmanın herhangi bir yolu var mı?


Yanıtlar:


27

Bunu bash'da yapmanın genel yolu parametre genişletmeyi kullanmaktır. ( Bash man sayfasına bakın ve "Parameter Expansion" ı arayın.)

a=${1%.*}

%Aşağıdaki deseni (eşleşen her şeyin gösterir .*, parametresinden silinecek olan mümkün olan en kısa eşleşme kullanarak, sağdan) $1. Bu durumda, ifade çevresinde çift tırnak işareti (") kullanmanız gerekmez.


1
Dosya kalıpları genellikle şu şekildedir: "Something.eng.ext". Açıkçası bu durumda dahili uzantıdır, ancak $ {1%. *} Kullanıldığında yalnızca "Bir şey" kısmı döndürülür, değil mi?
user304822

2
No ${1%.*}dönecektir Something.eng. Eğer .dahil olmak üzere ilk sağdaki her şeyi çıkarmak istiyorsanız ., kullanın ${1%%.*}, hangi dönecektir Something.
garyjohn


0

One-liner Bash kullanmadan basename :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.