#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Is er een manier om deze twee lijnen aan elkaar te lijmen tot een oneliner?
Answer
FILE=$(basename "${1/%.jpeg/.jpg}")
werkte voor mij.
test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
scriptinhoud:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Reacties
Antwoord
Je kunt niet nesten uitbreidingen in bash (noch in ksh, ash en andere shells behalve zsh). Dit is slechts een cosmetische beperking, aangezien je, zoals je illustreert, een tussenliggende uitdrukking kunt toewijzen aan een tijdelijke variabele. Het is een beetje vervelend voor oneliners, maar in scripts is het aantoonbaar beter voor de leesbaarheid.
Je zou je kunnen vermijden zing het externe hulpprogramma basename
en gebruik in plaats daarvan een stringmanipulatieconstructie:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Hier komt het voor dat je herschrijf uw script naar plaats de opdrachtvervanging aan de buitenkant . Dat is geen algemeen fenomeen, en je krijgt ook niets anders dan een bepaald oneliner-gevoel.
Met Zsh, voor beter of slechter, kun je uitbreidingen nesten:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Of je zou de ingebouwde constructie van zsh kunnen gebruiken in plaats van basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Antwoord
Ik “zou gaan voor:
FILE=$(basename $1 .jpeg).jpg
De tweede parameter voor basename is een achtervoegsel dat uit de bestandsnaam moet worden verwijderd (zie man basename
)
Answer
Je zou een enkel sed
commando kunnen gebruiken zoals in het volgende:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Answer
Met sed
zou dit moeten werken:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Dit beantwoordt uw vraag niet precies omdat ik het niet kan; ik weet niet zeker of het mogelijk is.)
Antwoord
The Bash constructies werken met variabelenamen , dus er is geen manier om een commando rechtstreeks in te sluiten. @sr_ “s benadering is een alternatief als je de extra fork niet erg vindt.
Answer
De regel
FILE=$(basename "${1/%.jpeg/.jpg}")
kan worden ingekort en draagbaarder gemaakt met
FILE=$(basename "${1%.jpeg}.jpg")
sed
zal zeker nodig zijn, denk ik.