使用mkvmerge处理MKV文件的Bash脚本多用户输入变量失效问题
问题原因
- 核心问题为变量赋值与调用错位:接收用户输入时,将音频轨道编号存入了
subvar变量、字幕轨道编号存入了audiovar变量,后续调用mkvmerge时,音频参数-a错误使用了存储字幕轨道编号的audiovar,字幕参数-s错误使用了存储音频轨道编号的subvar,参数完全不匹配导致轨道过滤逻辑失效。 - 额外隐患为变量未添加双引号,若用户输入多轨道编号、带空格的内容时,会被Shell解析为多个参数引发未知错误。
修复后代码
#!/bin/bash read -p 'Audio track to keep: ' audiovar read -p 'Subtitle track to keep: ' subvar read -p 'Filename suffix: ' suffixvar for file in *.mkv; do mkvmerge -o "${file%.mkv}.${suffixvar}.mkv" -a "$audiovar" -s "$subvar" "$file" done
调整说明
- 修正了输入变量的赋值逻辑,音频轨道编号存入
audiovar、字幕轨道编号存入subvar,和后续参数调用完全对应 - 所有变量外层添加双引号,避免特殊字符、空格、多轨道编号带来的Shell解析异常
- 修正mkv文件匹配通配符为
*.mkv,避免匹配异常 - 输出文件名的变量拼接统一放入双引号包裹的字符串内,避免拼接错误
内容的提问来源于stack exchange,提问作者PimPolacko
相关产品推荐
相关产品推荐

