#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Er det allikevel å lime disse to linjene sammen til en en-liner?
Svar
FILE=$(basename "${1/%.jpeg/.jpg}")
fungerte for meg.
test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
skriptinnhold:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Kommentarer
Svar
Du kan ikke rede utvidelser i bash (heller ikke i ksh, aske og andre skall bortsett fra zsh). Dette er bare en kosmetisk begrensning, siden du som illustrerer kan tildele et mellomuttrykk til en midlertidig variabel. Det er litt irriterende for en-liners, men i skript er det uten tvil bedre for lesbarhet.
Du kan unngå deg syng det eksterne verktøyet basename
og bruk en strengmanipulasjonskonstruksjon i stedet:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Her skjer det at du kan skriv om skriptet ditt til legg kommandosubstitusjonen på utsiden . Det er ikke et generelt fenomen, og du får heller ikke noe annet enn en viss følelse av en linje.
Zsh, på godt og vondt, lar deg hekke utvidelser:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Eller du kan bruke zsh «s innebygde konstruksjon i stedet for basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Svar
Jeg vil gå for:
FILE=$(basename $1 .jpeg).jpg
Den andre parameteren til basenavn er et suffiks som skal fjernes fra filnavnet (se man basename
)
Svar
Du kan bruke en enkelt sed
-kommando som i følgende:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Svar
Inkluderer sed
, dette skal gjøre susen:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Dette svarer ikke nøyaktig på spørsmålet ditt fordi jeg ikke kan; er usikker på om det er mulig.)
Svar
The Bash konstruerer arbeid med variabelnavn , så det er ingen måte å bygge inn en kommando direkte. @sr_s tilnærming er et alternativ hvis du ikke har noe imot den ekstra gaffelen.
Svar
Linjen
FILE=$(basename "${1/%.jpeg/.jpg}")
kan forkortes og gjøres mer bærbart med
FILE=$(basename "${1%.jpeg}.jpg")
sed
vil absolutt være nødvendig antar jeg.