#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Onko näitä kahta riviä liimattu yhteen linjaan?
Vastaus
FILE=$(basename "${1/%.jpeg/.jpg}")
toimi minulle.
testi:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
komentosarjan sisältö:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
kommentit
Vastaa
Et voi pestä laajennukset bashissa (eikä ksh: ssä, tuhkassa ja muissa kuorissa lukuun ottamatta zsh: tä). Tämä on vain kosmeettinen rajoitus, koska kuten kuvaat, voit määrittää väliaikaiselle muuttujalle välilausekkeen. Se on hieman ärsyttävää yhden linjan käyttäjille, mutta skripteissä se on luultavasti parempi luettavuuden kannalta.
Voit välttää u laula ulkoinen apuohjelma basename
ja käytä sen sijaan merkkijonon manipulaatiorakennetta:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Täällä tapahtuu, että voit kirjoita komentosarjasi uudelleen siten, että laittaa komennon korvaamisen ulkopuolelle . Se ei ole yleinen ilmiö, etkä saa mitään muuta kuin tiettyä yhden linjan tunnetta.
Zsh, hyvässä tai pahassa, antaa sinun pestä laajennuksia:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Tai voit käyttää zsh: n sisäänrakennettua rakennetta basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Vastaus
Menen:
FILE=$(basename $1 .jpeg).jpg
Basename-parametrin toinen pääte on tiedostonimestä poistettava pääte (katso man basename
)
Vastaa
Voit käyttää yhtä komentoa sed
kuten seuraavassa:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
vastaus
Sisältämällä sed
, tämän pitäisi tehdä temppu:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Tämä ei vastaa tarkasti kysymykseesi, koska en voi t; En ole varma, onko se mahdollista.)
Vastaa
Bash rakentaa työtä muuttujien nimien kanssa, joten komentoa ei voida upottaa suoraan. @sr_: n lähestymistapa on vaihtoehto, jos et muista ylimääräistä haarukkaa.
Vastaa
Rivi
FILE=$(basename "${1/%.jpeg/.jpg}")
voidaan lyhentää ja tehdä kannettavammaksi
FILE=$(basename "${1%.jpeg}.jpg")
sed
tarvitaan varmasti.