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。ただし、同じことが、 .bash_profile$xではなく、シェル スクリプト内の通常のシェル変数に対しても機能します$1(.bashrc でも同じことが起こると思います)。

何が問題なのでしょうか?また、何か解決策はありますか?

答え1

パラメータ展開内の$変数名 ( ) の先頭を削除します。1

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

$開始中括弧の前の変数はすでに参照されているので{、変数名の前に別の中括弧を付ける必要はありません。

答え2

dirnamebasenameおよびコマンドをお持ちの場合は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"

関連情報