Antworten:
FILE=$(basename "${1/%.jpeg/.jpg}")
arbeitete für mich.
Prüfung:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
Skriptinhalt:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Sie können Erweiterungen nicht in Bash (oder in Ksh, Asche und anderen Muscheln außer Zsh) verschachteln. Dies ist nur eine kosmetische Einschränkung, da Sie, wie Sie veranschaulichen, einer temporären Variablen einen Zwischenausdruck zuweisen können. Es ist ein wenig nervig für Einzeiler, aber in Skripten ist es wohl besser für die Lesbarkeit.
Sie können die Verwendung des externen Dienstprogramms vermeiden basename
und stattdessen ein Konstrukt zur Manipulation von Zeichenfolgen verwenden:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Hier kann es vorkommen, dass Sie Ihr Skript neu schreiben können, um die Befehlsersetzung nach außen zu verschieben . Das ist kein allgemeines Phänomen, und Sie gewinnen auch nichts anderes als ein bestimmtes Einzeiler-Gefühl.
Zsh, zum Guten oder zum Schlechten, lässt Sie Erweiterungen verschachteln:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Oder Sie können das integrierte Konstrukt von zsh anstelle von basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Die Linie
FILE=$(basename "${1/%.jpeg/.jpg}")
kann gekürzt und tragbarer gemacht werden mit
FILE=$(basename "${1%.jpeg}.jpg")
sed
wird sie definitiv benötigt, denke ich.