Bash中使用变量修改文件扩展名失败问题求助
问题分析与解决
这个问题的核心是你在使用变量替换时多写了一个多余的点,导致匹配模式出错,具体拆解来看:
- 当你直接用
${raw_file%.xlsx}时,匹配模式是.xlsx,刚好能精准匹配文件名末尾的.xlsx后缀,所以成功把后缀替换掉,得到test_file。 - 但当你把
.xlsx赋值给变量f后,你写的${raw_file%.$f}会被bash解析为:先展开$f得到.xlsx,整个匹配模式就变成了..xlsx(你手动加的一个点,加上变量自带的点)。而你的文件名结尾是.xlsx,并不是..xlsx,所以匹配完全失败,${raw_file%.$f}的结果还是原文件名test_file.xlsx,再拼接.csv自然就变成了test_file.xlsx.csv。
正确写法
只需要去掉手动添加的那个点,直接用变量作为匹配模式即可:
raw_file=test_file.xlsx f=.xlsx echo "${raw_file%$f}.csv"
执行这个命令就会输出test_file.csv,和你直接写.xlsx的效果完全一致。
额外补充
如果你的变量f是不带点的格式(比如f=xlsx),那才需要写成${raw_file%.$f},这时候模式是.xlsx,才能正确匹配后缀。核心原则就是:确保匹配模式和文件名后缀完全一致,不要重复添加符号。
内容的提问来源于stack exchange,提问作者user2058738
相关产品推荐
相关产品推荐

