#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Czy w ogóle można skleić te dwie linie razem w jednej linijce?
bash
shell
shell-script
string
gsklee
źródło
źródło
sed
, na pewno będzie to potrzebne.Nie możesz zagnieżdżać rozszerzeń w bash (ani w ksh, ash i innych powłokach oprócz zsh). Jest to jedynie ograniczenie kosmetyczne, ponieważ jak zilustrujesz, możesz przypisać wyrażenie pośrednie do zmiennej tymczasowej. Jest to trochę denerwujące dla jedno-liniowych, ale w skryptach jest prawdopodobnie lepsze dla czytelności.
Można uniknąć używania zewnętrznego narzędzia
basename
i zamiast tego użyć konstrukcji do manipulacji ciągiem:Tutaj zdarza się, że możesz przepisać skrypt, aby umieścić podstawienie polecenia na zewnątrz . To nie jest ogólne zjawisko, ani nie zyskujesz nic innego niż pewne poczucie jednowarstwowości.
Zsh, na dobre lub na złe, pozwala zagnieżdżać rozszerzenia:
Lub możesz użyć wbudowanej konstrukcji zsh zamiast
basename
:źródło
Wybrałbym:
Drugi parametr do nazwy basename to sufiks, który należy usunąć z nazwy pliku (patrz
man basename
)źródło
Możesz użyć jednego
sed
polecenia, jak poniżej:źródło
Włączenie
sed
powinno załatwić sprawę:(To nie do końca odpowiada na twoje pytanie, ponieważ nie mogę; nie jestem pewien, czy to możliwe).
źródło
Konstrukcje Bash
${}
działają z nazwami zmiennych , więc nie ma możliwości bezpośredniego osadzenia polecenia. Podejście @ sr_ jest alternatywą, jeśli nie przeszkadza ci dodatkowy widelec.źródło
Linia
można go skrócić i uczynić bardziej przenośnym
źródło