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"