shell 在bash中获取目录或文件的基本名称的一种快速而正确的方法

wa7juj8i  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(136)

我有这样的代码:

get_base() { echo "${1##*/}"; }

在后面有一个或多个斜杠之前,这种方法可以正常工作
我已经找到了一个解决方案来解决这个问题,但问题是我们需要启用extglob,而我不希望这样:

ari@ari-gentoo ~ % x='/home/ari///'

ari@ari-gentoo ~ % echo "${x%%+(/)}"
/home/ari

然后,我们可以obv将其保存到一个临时变量中,并在其上运行基本名称替换
无论如何,我的问题是,有没有什么合适的方法来做到这一点,它仍然是快速的(这意味着没有调用外部命令,因为这个函数被调用了很多),而不需要任何花哨的功能启用?
感谢提前给出的答案:)

问题和答案

否,因为所有这些解决方案要么使用命令,要么具有仅去除最后一个斜杠而不是倍数的替换表达式:)(例如,带有expr ${x%/}的/home/ari///在需要为/home/ari时将仅变为/home/ari//)

  • 你说的“适当”是什么意思

我所说的“适当”是指“在不启用extglob或任何其他花哨功能的情况下实现”

vdzxcuhz

vdzxcuhz1#

这里有一种方法:
第一个

kdfy810k

kdfy810k2#

一个快速而正确的方法来获得...在狂欢
作为对oguz ismail's correct answer的补充,我建议对这种函数使用-v标志,以减少分叉:

get_base() {
    if [[ $1 == -v ]] ;then
        local -n _res=$2
        shift 2
    else
        local _res
    fi
    set -- "${1%"${1##*[!/]}"}"
    printf -v _res %s "${1##*/}"
    [[ ${_res@A} == _res=* ]] && echo "$_res"
}

这使您可以通过以下方式尝试此功能

$ get_base /path/entry////
entry

但是为了将结果存储到某个变量中,您应该避免无用的fork,如

myvar=$(get_base /path/entry////)

并使用首选语法:

$ get_base -v myvar /path/entry////
$ echo $myvar
entry

要成为 * 拆分 * entrypath的函数,请执行以下操作:

get_base() {
    if [[ $1 == -v ]] ;then
        local -n _res=$2
        shift 2
    else
        local _res
    fi
    set -- "${1%"${1##*[!/]}"}"
    printf -v _res %s "${1##*/}"
    [[ ${_res@A} == _res=* ]] &&
        echo "$_res" "${1%/$_res}" && return
    printf -v _res[1] %s "${1%/$_res}"
}

然后道:

$ get_base /path/to/entry////
entry /path/to

$ get_base -v myvar /path/to/entry////
$ declare -p myvar 
declare -a myvar=([0]="entry" [1]="/path/to")
$ echo ${myvar[0]}
entry
$ echo ${myvar[1]}
/path/to

带有空格的Unicode文件名:

$ get_base -v myvar '/path/to/some dir/some loved file ♥♥♥.xtns'
$ declare -p myvar 
declare -a myvar=([0]="some loved file ♥♥♥.xtns" [1]="/path/to/some dir")
eqqqjvef

eqqqjvef3#

思路:

get_base() { [[ $1 =~ ([^/]*)/*$ ]]; echo "${BASH_REMATCH[1]}"; };
get_base() { while [[ "${1%/}" != "$1" ]]; do set -- "${1%%/}"; done; echo "${1##*/}"; }

相关问题