如何在Zsh中获取带点的文件扩展名(单行实现)
Zsh中简洁获取带点文件扩展名的方法
直接给两种单行实现方案,完美满足需求:
方案一:利用参数展开的条件判断语法
# 示例使用 filename="one.two" echo "${filename:e:+.$filename:e}" # 输出 .two filename="none" echo "${filename:e:+.$filename:e}" # 输出空字符串
原理:${param:+word}是Zsh的核心参数展开语法——当param不为空时,展开成指定的word;如果param为空,整个表达式就为空。这里${filename:e}负责提取扩展名(无扩展名时返回空),所以有扩展名时会拼接出.扩展名,无扩展名时直接返回空。
方案二:通过字符串截取实现
# 示例使用 filename="one.two" echo "${filename#${filename%.*}}" # 输出 .two filename="none" echo "${filename#${filename%.*}}" # 输出空字符串
原理:
${filename%.*}会去掉文件名中最后一个.及其后面的内容,得到文件的主体部分(比如one.two会变成one,none还是none)${filename#主体部分}会从原文件名中去掉前面匹配到的主体部分,剩下的就是带点的扩展名;如果没有扩展名,主体部分就是原文件名,去掉后自然为空。
补充说明
你之前尝试的"${existing:r}-$count.${existing:e}"会在无扩展名时多出一个.,是因为${existing:e}为空时,.会被保留。上面的两种方案都能彻底避免这个问题,无需写繁琐的if判断逻辑。
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

