функция bash: разделение имени и расширения файла

функция bash: разделение имени и расширения файла

splitУ меня в файле .bash_profile есть следующая функция .

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

Теперь я должен ожидать, что команда split foo.barдаст мне

filename=foo  extension=bar

Но я получаю -bash: ${$1%.*}: bad substitutionсообщение об ошибке. То же самое, однако, работает для обычной переменной оболочки в скрипте оболочки, скажем, $xвместо $1.bash_profile (я думаю, то же самое происходит и в .bashrc).

Что не так и есть ли способ исправить ситуацию?

решение1

Удалите $предшествующее имя переменной ( 1) внутри расширения параметра:

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

Вы уже ссылаетесь на переменную, поставив $перед ней начальную скобку {, нет необходимости ставить еще одну перед именем переменной.

решение2

Если у вас есть команды dirname, basenameи awk, вы можете рассмотреть это определение функции

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"

Связанный контент