Bash参数扩展 - 获取文件的直接父目录

时间:2015-12-05 18:14:46

标签: bash shell parameter-expansion

我想获取给定文件的直接父目录的名称,例如foo使用参数展开/home/blah/foo/bar.txt。现在我可以用两行来完成:

f="/home/blah/foo/bar.txt"
dir_name="${f%/*}"
immediate_parent="${dir_name##*/}"

但我对参数扩展很新,所以我认为这可以进行优化。有没有办法只用一行呢?

1 个答案:

答案 0 :(得分:5)

您无法通过单个参数扩展来执行此操作,但您可以使用[[ $f =~ ^.*/(.+)/.+$ ]] && immediate_parent=${BASH_REMATCH[1]} ,Bash的正则表达式匹配运算符:

awk

注意:假设一个至少包含2个组件的绝对路径。

如果可以接受调用外部实用程序,immediate_parent=$(awk -F/ '{ print $(NF-1) }' <<<"$f") 提供了一种更简单的替代方法:

#

至于 为什么无法通过单一参数扩展来完成

  • 参数展开允许剥离 前缀## / % a后缀%% / immediate_parent=${f:11:3}),但不是

    • 嵌套前缀和后缀修剪扩展,虽然原则上支持但没有帮助,因为您需要迭代修改值,而扩展只有返回修改后的字符串;换句话说:有效的整体扩展仍然只执行单个扩展操作,并且您再次坚持使用 前缀< em>或后缀操作。
  • 使用单个参数展开,提取内部子字符串只能通过字符位置和长度 来完成;例如,基于样本输入的硬编码解决方案将是:immediate_parent=${f:$(d=${f%/*/*}; printf %s ${#d})+1:$(awk -F/ '{ print length($(NF-1)) }' <<<"$f")}

    • 可以使用算术表达式甚至命令替换作为参数扩展参数,但是如果我们尝试的话,这种方法的无意义 - 至少在这种情况下 - 变得明显;注意嵌入式命令替换 - 第一个计算字符位置,第二个计算长度:

      @officeFrom.get.