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
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"