Prosty problem do rozwiązania: w skrypcie napisanym w Bashu z nazwy pliku usunąć jego rozszerzenie, czyli zostawić sobie tylko nazwę pliku. Przez rozszerzenie rozumiem wszystko co występuje po ostatniej kropce.

Pierwszym moim pomysłem było utworzenie wyrażenia regularnego, ale to wygląda jak strzelanie z armaty do muchy. Więc trzeba zajrzeć do dokumentacji polecenia bash, i tam można znaleźć taką oto definicję:

${parameter%word}
${parameter%%word}
        Remove matching suffix pattern.

Konstrukcja ta działa następująco: w wartości podanego parametru (parameter) wyszukuje zadany ciąg znaków (word) i w przypadku znalezienie ucina jego jak najkrótszy fragment (w przypadku użycia %) lub jak najdłuższy (w przypadku użycia %%).

Tak będzie wyglądało usunięcie jakiegoś rozszerzenia z pliku:

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.dwa}
nazwa.jeden

Jak widać w efekcie ciąg znaków .dwa został usunięty. Teraz trzeba rozszerzyć to zachowanie na dowolne rozszerzenie, czyli zamiast rozszerzenia użyć znaku * (gwiazdki):

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.*}
nazwa.jeden
~$ echo ${PLIK%%.*}
nazwa

Proszę zwrócić uwagę na różnicę pomiędzy % a %%. W przypadku użycia % zostało usunięte tylko ostatnia rozszerzenie (czyli najkrótszy ciąg mogący zostać dopasowany). Natomiast przy użyciu %% zostały usunięte znaki od wystąpienia pierwszej kropki, czyli największy zakres jaki pasował do zdefiniowanego wzorca.

Istnieje także wariant tego polecenia umożliwiający usuwanie pierwszych znaków (czyli prefiksu), zamiast znaku % należy użyć #:

${parameter#word}
${parameter##word}
        Remove matching prefix pattern.

Źródła