我有這個代碼:
get_base() { echo "${1##*/}"; }
這作業正常,直到我們有 1 個或多個斜杠
我找到了解決方法,但問題是我們需要extglob啟用,我不希望這樣:
ari@ari-gentoo ~ % x='/home/ari///'
ari@ari-gentoo ~ % echo "${x%% (/)}"
/home/ari
然后我們可以 obv 將它保存到一個 tmp var 并在其上運行 basename 替換
無論如何,我的問題是,是否有任何適當的方法可以做到這一點并且它仍然很快(意味著沒有呼叫外部命令,因為這個函式被呼叫了很多)而不需要啟用任何花哨的功能?
提前感謝您的回答:)
問題和解答
- Get last dirname/filename in a file path argument in Bash回答你的問題嗎?
否,因為所有這些解決方案要么使用命令,要么具有僅去除最后一個斜杠而不是倍數的替換運算式:)(例如 /home/ari/// 與 expr ${x%/} 將變為僅 /home/ari/ / 當它需要是 /home/ari)
- 你所說的“適當”是什么意思
我的意思是“在不啟用 extglob 或任何其他花哨功能的情況下實作”
uj5u.com熱心網友回復:
這是一種方法:
get_base() {
set -- "${1%"${1##*[!/]}"}"
printf '%s\n' "${1##*/}"
}
$ get_base /home/oguz//
oguz
$ get_base /root
root
$ get_base /
$ get_base .bash_history
.bash_history
uj5u.com熱心網友回復:
想法:
get_base() { [[ $1 =~ ([^/]*)/*$ ]]; echo "${BASH_REMATCH[1]}"; };
get_base() { while [[ "${1%/}" != "$1" ]]; do set -- "${1%%/}"; done; echo "${1##*/}"; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515317.html
上一篇:cv2中的可變fps(每秒幀數)
