Bash – Jatkuva merkkijonon manipulointi

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

  • Koska nämä kaksi riviä ovat tavallaan keskenään vaihdettavissa, tämä ratkaisu on toistaiseksi siistin … Jos linjat eivät ole ' t vaihdettavissa sed tarvitaan varmasti.

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") 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *