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错误消息。然而,同样适用于 shell 脚本中的常用 shell 变量,例如,$x而不是$1.bash_profile 中的变量(我认为 .bashrc 中也同样如此)。

这是什么问题以及有什么补救办法吗?

答案1

删除参数扩展中$前面的变量名 ( ):1

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

您已经通过$前面的起始大括号引用了该变量{,无需在变量名称前面再添加另一个大括号。

答案2

如果您有dirname,basenameawk命令,您可能需要考虑此函数定义

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"

相关内容