Ich habe die folgende Funktion split
in meiner .bash_profile-Datei.
function split {
name="${$1%.*}"
ext="${$1##*.}"
echo filename=$name extension=$ext
}
Nun sollte ich erwarten, dass der Befehl split foo.bar
mir gibt
filename=foo extension=bar
Aber ich bekomme -bash: ${$1%.*}: bad substitution
eine Fehlermeldung. Dasselbe funktioniert jedoch für normale Shell-Variablen in einem Shell-Skript, beispielsweise $x
statt $1
in .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
, basename
und awk
verfü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"