首页 > 解决方案 > 如何在 bash 脚本中正确处理 .js 扩展名?

问题描述

我有以下 bash 脚本。

while IFS= read -r filename;
  do [[ $(md5 path/to/"$filename-orig") = $(md5 path/to/"$filename") ]] || echo $filename differs;
  done < path/to/list-of-files-to-compare.txt

它应该比较两个文件(通过计算它们的 MD5 哈希摘要)然后报告它们是否不同。它从列表中获取要比较的文件。

问题是,如果我要读取的文件位于,比如说,

path/to/foo-orig.js

该脚本将在以下位置查找文件

path/to/foo.js-orig

而且,显然,这会引发错误并失败。

如何更正脚本中的这个错误,以便.js正确处理扩展?

编辑

TL;博士:

给定一个字符串foo.bar我怎么能得到foo-orig.bar

标签: bashshellunix

解决方案


如果我理解正确,您实际上只是在问:给定一个字符串foo.bar,我怎样才能得到一个字符串foo-orig.bar?这可以这样做:

$ f="path/to/foo.js"
$ echo "${f%.js}-bak.js"
path/to/foo-bak.js

它记录在参数扩展man bash

${parameter%word}
${parameter%%word}
删除匹配的后缀模式。单词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数扩展值的尾随部分,则扩展的结果是删除了最短匹配模式("%"案例)或最长匹配模式(案例)的参数扩展值。"%%"如果 parameter 是@*,模式移除操作将依次应用于每个位置参数,展开是结果列表。@如果 parameter 是一个以or为下标的数组变量*,则模式删除操作将依次应用于数组的每个成员,并且展开是结果列表。


推荐阅读