Bash-Funktion: Aufteilen von Name und Erweiterung einer Datei

Bash-Funktion: Aufteilen von Name und Erweiterung einer Datei

Ich habe die folgende Funktion splitin meiner .bash_profile-Datei.

function split {
   name="${$1%.*}"
   ext="${$1##*.}"
   echo filename=$name extension=$ext
}

Nun sollte ich erwarten, dass der Befehl split foo.barmir gibt

filename=foo  extension=bar

Aber ich bekomme -bash: ${$1%.*}: bad substitutioneine Fehlermeldung. Dasselbe funktioniert jedoch für normale Shell-Variablen in einem Shell-Skript, beispielsweise $xstatt $1in .bash_profile (ich glaube, dasselbe gilt auch für .bashrc).

Was ist los und gibt es eine Abhilfe?

Antwort1

Lassen Sie den $vor dem Variablennamen stehenden Wert ( 1) innerhalb der Parametererweiterung weg:

name="${1%.*}"
ext="${1##*.}"

Sie verweisen bereits mit der $einleitenden Klammer auf die Variable {, eine weitere vor dem Variablennamen ist nicht erforderlich.

Antwort2

Wenn Sie über die Befehle dirname, basenameund awkverfügen, sollten Sie diese Funktionsdefinition berücksichtigen

function split {

DIR=$(/bin/dirname "$1")
BASE=$(/bin/basename "$1")
EXT=$(echo "$BASE" | /usr/bin/awk -F. 'NF>1 {print $NF}')
NAME=${BASE%.$EXT}
echo directory=$DIR filename=$NAME extension=$EXT

}

split good.bye/data.txt
split good.bye/data
split data.txt
split good.bye/data.001.txt
split "good bye/data 001.txt"

verwandte Informationen