csh如何使用变量修饰符从末尾带/的路径中提取上一级目录
csh 实现方案
可以通过拼接辅助路径段+链式调用变量修饰符的方式实现,适配末尾带/和不带/的两种场景,无需调用外部命令:
# 路径末尾无斜杠场景 % set x=a/b/c % echo ${x}/.:h:h a/b # 路径末尾带斜杠场景 % set x=a/b/c/ % echo ${x}/.:h:h a/b
原理:给原路径拼接/.后,无论原路径末尾是否存在斜杠,都会等效为[原路径去除末尾所有斜杠]/.的格式,第一次调用:h会得到去掉.后的路径[原路径去除末尾所有斜杠],第二次调用:h即可取到上一级目录。
bash 实现方案
核心思路是先移除路径末尾的斜杠,再删除最后一级路径,由于bash不支持嵌套参数展开,需要借助临时变量实现:
# 路径末尾无斜杠场景 $ x=a/b/c $ tmp=${x%/}; echo ${tmp%/*} a/b # 路径末尾带斜杠场景 $ x=a/b/c/ $ tmp=${x%/}; echo ${tmp%/*} a/b
原理:${x%/}会删除路径末尾的单个斜杠(如果不存在则不修改原路径),处理后得到末尾无斜杠的路径,再通过${tmp%/*}删除最后一段路径及前导斜杠,即可得到目标结果。
如果开启extglob选项的话也可以一次性移除末尾所有斜杠,效果一致:
shopt -s extglob tmp=${x%%+(/)}; echo ${tmp%/*}
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

