#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Există oricum să lipim aceste două linii împreună într-un singur liner?
Răspuns
FILE=$(basename "${1/%.jpeg/.jpg}")
a funcționat pentru mine.
test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
conținut script:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Comentarii
Răspuns
Nu poți să cuibărești expansiuni în bash (nici în ksh, cenușă și alte cochilii în afară de zsh). Aceasta este doar o limitare cosmetică, deoarece așa cum ilustrați, puteți atribui o expresie intermediară unei variabile temporare. Este puțin enervant pentru un singur liner, dar în scripturi este, probabil, mai bine pentru lizibilitate.
Ați putea evita u cântați utilitarul extern basename
și utilizați în schimb o construcție de manipulare a șirurilor:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aici se întâmplă că puteți rescrieți scriptul pentru a pune înlocuirea comenzii în exterior . Acest lucru nu este un fenomen general și nici nu obțineți altceva decât un anumit sentiment de linie.
Zsh, în bine sau în rău, vă permite să cuibăriți expansiuni:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Sau puteți utiliza construcția încorporată a zsh în loc de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Răspuns
Aș alege:
FILE=$(basename $1 .jpeg).jpg
Al doilea parametru pentru numele de bază este un sufix care trebuie eliminat din numele fișierului (vezi man basename
)
Răspuns
Puteți utiliza o singură comandă sed
ca în cele ce urmează:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Răspuns
Incorporând sed
, acest lucru ar trebui să facă trucul:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Acest lucru nu răspunde exact la întrebarea dvs., deoarece nu pot; nu sunt sigur dacă este posibil.)
Răspunde
The Bash construiește funcționează cu nume de variabile , deci nu există nicio modalitate de a încorpora o comandă direct. Abordarea @sr_ este o alternativă dacă nu vă deranjează furculița suplimentară.
Răspuns
Linia
FILE=$(basename "${1/%.jpeg/.jpg}")
poate fi scurtat și făcut mai portabil cu
FILE=$(basename "${1%.jpeg}.jpg")
sed
va fi cu siguranță nevoie, cred.