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"

相關內容