我想获取给定文件的直接父目录的名称,例如foo
使用参数展开/home/blah/foo/bar.txt
。现在我可以用两行来完成:
f="/home/blah/foo/bar.txt"
dir_name="${f%/*}"
immediate_parent="${dir_name##*/}"
但我对参数扩展很新,所以我认为这可以进行优化。有没有办法只用一行呢?
答案 0 :(得分:5)
您无法通过单个参数扩展来执行此操作,但您可以使用[[ $f =~ ^.*/(.+)/.+$ ]] && immediate_parent=${BASH_REMATCH[1]}
,Bash的正则表达式匹配运算符:
awk
注意:假设一个至少包含2个组件的绝对路径。
如果可以接受调用外部实用程序,immediate_parent=$(awk -F/ '{ print $(NF-1) }' <<<"$f")
提供了一种更简单的替代方法:
#
至于 为什么无法通过单一参数扩展来完成:
参数展开允许剥离 前缀(##
/ %
) 或来自变量值的em> a后缀(%%
/ immediate_parent=${f:11:3}
),但不是。
使用单个参数展开,提取内部子字符串只能通过字符位置和长度 来完成;例如,基于样本输入的硬编码解决方案将是:immediate_parent=${f:$(d=${f%/*/*}; printf %s ${#d})+1:$(awk -F/ '{ print length($(NF-1)) }' <<<"$f")}
你可以使用算术表达式甚至命令替换作为参数扩展参数,但是如果我们尝试的话,这种方法的无意义 - 至少在这种情况下 - 变得明显;注意嵌入式命令替换 - 第一个计算字符位置,第二个计算长度:
@officeFrom.get.