#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Gibt es überhaupt eine Möglichkeit, diese beiden Linien zu einem Einzeiler zusammenzukleben?
Antwort
FILE=$(basename "${1/%.jpeg/.jpg}")
hat bei mir funktioniert.
Test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
Skriptinhalt:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Kommentare
- Da die beiden Zeilen irgendwie austauschbar sind, ist diese Lösung bisher die sauberste … Wenn die Zeilen nicht ' nicht austauschbar sind
sed
wird definitiv benötigt, denke ich.
Antwort
Sie können nicht nisten Erweiterungen in bash (noch in ksh, ash und anderen Schalen außer zsh). 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 ärgerlich für Einzeiler, aber in Skripten ist es wohl besser für die Lesbarkeit.
Sie könnten u vermeiden Singen Sie das externe Dienstprogramm basename
und verwenden Sie stattdessen ein Konstrukt zur Manipulation von Zeichenfolgen:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Hier können Sie dies Schreiben Sie Ihr Skript neu in und setzen Sie die Befehlsersetzung nach außen . Dies ist weder ein allgemeines Phänomen, noch gewinnen Sie etwas 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
verwenden:
FILE=${${1:t}/%.jpeg/.jpg}
Antwort
Ich würde mich für Folgendes entscheiden:
FILE=$(basename $1 .jpeg).jpg
Der zweite Parameter für den Basisnamen ist ein Suffix, das aus dem Dateinamen entfernt werden soll (siehe man basename
).
Antwort
Sie können einen einzelnen sed
-Befehl wie folgt verwenden:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Antwort
Mit sed
sollte dies den Trick tun:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Dies beantwortet Ihre Frage nicht genau, da ich nicht sicher bin, ob dies möglich ist.)
Antwort
Der Bash -Konstrukte arbeiten mit Variablennamen , daher gibt es keine Möglichkeit, einen Befehl direkt einzubetten. Der Ansatz von @sr_ ist eine Alternative, wenn Sie die zusätzliche Gabel nicht stören.
Antwort
Die Zeile
FILE=$(basename "${1/%.jpeg/.jpg}")
kann mit
FILE=$(basename "${1%.jpeg}.jpg")
verkürzt und portabler gemacht werden