result=${PWD##*/} # to assign to a variable
printf '%s\n' "${PWD##*/}" # to print to stdout
# ...more robust than echo for unusual names
# (consider a directory named -e or -n)
printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input
# ...useful to make hidden characters readable.
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
或者,没有 extglob :
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result=${result##*/} # remove everything before the last /
19 回答
如果您使用的是Bourne shell或
${PWD##*/}
不可用 .不需要basename,特别是不需要运行pwd的子shell(adds an extra, and expensive, fork operation); shell可以使用parameter expansion在内部执行此操作:
请注意,如果您在其他情况下应用此技术(不是
PWD
,而是包含目录名称的其他变量),则可能需要修剪任何尾部斜杠 . 下面使用bash的extglob support甚至可以使用多个尾部斜杠:或者,没有
extglob
:我喜欢所选择的答案(Charles Duffy),但如果你在符号链接的目录中并且想要目标目录的名称,请小心 . 不幸的是我不认为它可以在单个参数扩展表达式中完成,也许我错了 . 这应该工作:
为了看到这个,一个实验:
报告“酒吧”
DIRNAME
要显示路径的前导目录(不产生/ usr / bin / dirname的fork-exec):
这将是例如变换foo / bar / baz - > foo / bar
我用这个命令:
dirname "$0"
要么
下面用正则表达式grep也工作,
我更喜欢使用gbasename,这是GNU coreutils的一部分 .
OR
将内部文件名称分隔符(IFS)转回空格 .
IFS =之后有一个空格 .
grep怎么样:
我通常在sh脚本中使用它
你可以用它来自动化......
使用basename程序 . 对于你的情况:
您可以使用pwd和basename的组合 . 例如 .
令人惊讶的是,没有人提到只使用内置bash命令的替代方案:
作为 added bonus ,您可以使用以下命令轻松获取父目录的名称:
这些将适用于Bash 4.3-alpha或更新版本 .
只需使用:
要么
对于像我这样的发现骑师:
您可以使用basename实用程序从字符串中删除以/结尾的任何前缀(如果存在于字符串中),并在标准输出上打印结果 .
这个帖子很棒!这是另一种味道:
以下命令将导致在bash脚本中打印当前工作目录 .