我正在尝试编写我的第一个半高级bash脚本,它将以引用avi视频的文件名的形式输入,将其发送ffmpeg到转换为mp4(保留原始名称),然后将其移交给MP4Box.
以下是我正在做的事情......
#!/usr/bin/bash
ffmpeg -i $0 -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre hq -crf 22 -threads 0 ($0).mp4
MP4Box -inter 500 ($0).mp4
Run Code Online (Sandbox Code Playgroud)
使用一种快速的方法来使一个程序的执行依赖于另一个程序的成功&&.(以下命令都是伪代码)
first-cmd && second-cmd
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只有first-cmd返回true才会执行second-cmd.
同样,您可以测试失败并使用适当的操作 ||
bad-cmd || echo "failed"
Run Code Online (Sandbox Code Playgroud)
您可以通过各种方式组合它们:
good-cmd && echo "succeeded" || echo "failed"
bad-cmd || {
recovery-cmd ||
echo "recovery failed &&
echo "recovered"
}
Run Code Online (Sandbox Code Playgroud)
当然,使用$?其他人注意到的特殊变量通常更为清晰.
您经常需要将错误消息重定向到/dev/null变量或将其捕获到变量中.
bad-cmd 2>/dev/null # send error message to the bit bucket
var=$(good-cmd) # capture stdout
var=$(bad-cmd 2>&1) # capture stdout and stderr
var=$(bad-cmd 2>&1 >/dev/null) # capture only stderr
Run Code Online (Sandbox Code Playgroud)
然后,您可以处理错误的文本以获取代码中的条件操作的其他信息.
请参阅:捕获变量中的输出以及如何将stderr重定向到管道?
总的来说,您可以检查返回代码以确定命令的结果.您可以使用特殊变量获取先前执行的命令的返回码$?.请注意每次命令后都要更新,所以用它来设置另一个变量.例如RC = $?.返回代码通常为0表示成功,非零表示失败.特定的非零返回码可以指示特定类型的故障.检查命令的手册页以确切了解如何解释它们.获得返回代码后,您可以使用它来分支.例如:
ffmpeg <your args>
RC=$?
if [ "${RC}" -ne "0" ]; then
# Do something to handle the error.
else
# Everything was ok.
fi
Run Code Online (Sandbox Code Playgroud)