从“find”启动的“sh -c”脚本中的单引号问题

从“find”启动的“sh -c”脚本中的单引号问题

现在我写脚本已经很长时间了,但最近这个问题让我抓狂。我尝试了一切但无法解决它。

find . -iname "*.mp4" -type f -exec ffmpeg -i "{}" -c:a "$ACODEC" -c:v "$VCODEC" -vf \
    "subtitles={}.$SUBEXTE:'force_style=fontsize=$FSIZE,fontname=$FNAME'" \
"{}.$EXTE" -hide_banner \;

这个想法是每当find找到 mp4 文件时,执行此FFmpeg命令。但是当我想尝试更复杂的东西时,比如最后一个变量的命令替换{}.$EXTE,我必须使用以下语法:

find . -iname "*.mp4" -type f -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3"\
 -vf "subtitles=$1.$4:'force_style=fontsize=$5,fontname=$6'" \
"$1.$7" -hide_banner' -- "{}" "$ACODEC" "$VCODEC" "$SUBEXTE" "$FSIZE" "$FNAME" "$EXTE" \;

正如您在使用此语法时看到的那样sh -c,我需要添加额外的单引号' '。但这打破了FFmpeg密码。我尝试了几乎所有可能的变化;添加和删​​除单双引号,甚至尝试反斜杠。请帮我!我遇到的一些错误:

Unable to open ./sub.srt
[AVFilterGraph @ 0x7fffdb7d35e0] Error initializing filter 'subtitles' with args './sub.srt:force_style=fontsize='
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!
And sometimes I got an error like not suitable format for fontname

答案1

单引号字符串永远不能包含单引号。

在您的情况下,解决此难题的方法是将'内联sh -c脚本中的每个内部替换为'\''(或'"'"')。

这样做的目的是

  1. 暂时脱离单引号字符串(第一个'结束'\''单引号字符串),
  2. 插入一个文字'\'in '\'',你也可以写成"'",但那是远的太多的引用导致其难以阅读),然后
  3. 将其与剩余的原始单引号字符串连接起来(最后的'in'\''开始一个新的单引号字符串)。

sh -c命令看起来像

sh -c '
ffmpeg -i "$1" -c:a "$2" -c:v "$3" \
    -vf "subtitles=$1.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
    "$1.$7" -hide_banner' ...arguments as before ...

相关内容