Bash – ciągłe manipulowanie ciągami

#!/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") 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *