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"