#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Czy w ogóle można skleić te dwie linie w jedną linijkę?
Odpowiedź
FILE=$(basename "${1/%.jpeg/.jpg}")
zadziałało dla mnie.
test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
zawartość skryptu:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Komentarze
- Ponieważ te dwie linie są w pewnym sensie wymienne, to rozwiązanie jest jak dotąd najlepsze … Jeśli linie nie są ' t wymienne będzie zdecydowanie potrzebne.
Odpowiedź
Nie można zagnieździć rozszerzenia w bash (ani w ksh, ash i innych powłokach poza zsh). Jest to tylko kosmetyczne ograniczenie, ponieważ jak zilustrujesz, możesz przypisać wyrażenie pośrednie do zmiennej tymczasowej. Jest to trochę irytujące dla jednoliniowych, ale w skryptach jest to prawdopodobnie lepsze dla czytelności.
Możesz uniknąć u zaśpiewaj zewnętrzne narzędzie basename
i zamiast tego użyj konstrukcji manipulującej ciągiem:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Tutaj zdarza się, że możesz przepisz swój skrypt na umieść podstawianie poleceń na zewnątrz . To nie jest ogólne zjawisko, ani nie zyskujesz niczego poza pewnym jednowierszowym uczuciem.
Zsh, na dobre i na złe, pozwala ci zagnieżdżać ekspansje:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Lub możesz użyć wbudowanej konstrukcji zsh „zamiast basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Odpowiedź
Chciałbym:
FILE=$(basename $1 .jpeg).jpg
Drugi parametr basename to przyrostek, który należy usunąć z nazwy pliku (patrz man basename
)
Odpowiedź
Możesz użyć pojedynczego polecenia sed
, jak poniżej:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Odpowiedź
Uwzględniając sed
, powinno to załatwić sprawę:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(To nie jest dokładną odpowiedzią na twoje pytanie, ponieważ nie mogę; nie jestem pewien, czy to możliwe.)
Odpowiedź
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 masz nic przeciwko dodatkowemu rozwidleniu.
Odpowiedź
Linia
FILE=$(basename "${1/%.jpeg/.jpg}")
można skrócić i uczynić bardziej przenośnym dzięki
FILE=$(basename "${1%.jpeg}.jpg")