bash - bash for 循环中的ffmpeg:寻找匹配的'}'时出现意外的EOF
问题描述
我有一个基本命令 ( ffmpeg -i input_file out.srt
) 可以将.mkv
视频文件转换为.srt
字幕文件。问题是我必须为每个.mkv
文件手动运行命令。所以我尝试在 Bash 中实现一个 for 循环,但我不断收到错误。
#!/bin/bash
# ffmpeg -i input_file out.srt
for i in *.mkv ; do
ffmpeg -i "$i" "$(basename "${i/.mkv)")".str
sleep 30
done
我得到的两个错误是:
./subcon.sh: line 6: unexpected EOF while looking for matching `}'
./subcon.sh: line 9: syntax error: unexpected end of file
我不熟悉 Bash 以了解发生了什么。有谁知道我可以在哪里查找资料或如何解决这个特定问题?
解决方案
问题:
- 不匹配的括号。更改
{
为(
。 - 字幕扩展名不正确。更改
str
为srt
。 basename
语法不正确。更改"$(basename "${i/.mkv)")".str
为"$(basename "$i" .mkv)".srt
。或者使用 Bash 参数扩展而不是basename
.
新脚本:
#!/bin/bash
# ffmpeg -i input_file out.srt
for i in *.mkv ; do
ffmpeg -i "$i" "$(basename "$i" .mkv)".srt
sleep 30
done
您可以消除basename
:
#!/bin/bash
# ffmpeg -i input_file out.srt
for i in *.mkv ; do
ffmpeg -i "$i" "${i%.*}.srt"
sleep 30
done
我推荐shellcheck.net来检查你的 Bash 脚本。
推荐阅读
- javascript - 在javascript中执行回调函数?
- amazon-cloudformation - Cloudformation 自定义资源触发器
- java - 使用java中的反射从类绝对路径中获取类属性
- ios - 如何在我的返回方法上更改可观察类型
- docker - 'docker-compose up' 作为不同的用户而不重新创建容器
- amazon-web-services - API Gateway 不会将 Authorization 标头传递给 Lambda
- git - 如何配置 git 以忽略文件更改但仍将其恢复?
- ssl - keytool error: java.lang.Exception: Public keys in reply and keystore don't match errors when importing crt
- regex - 如何解析文本块并根据该块中的另一个值获取一个值
- database - CouchDB 永久认证密钥