有没有办法安全地中断引号内的长命令行?

有没有办法安全地中断引号内的长命令行?

我写了一个有点复杂的命令。因为有几个' '" "引号。以及转义条件'\''(由于某些原因,该用法是强制性的。我研究了很多)。我尝试用\任何引号来打破该行,我遇到了find无法识别的问题ffmpeg,其余的作为命令。其中还shellcheck.net写着:“不要在引号内换行。”。我怎样才能安全地做到这一点?这是代码:

#!/usr/bin/env sh
a="copy"
v="h264"
exts="srt"
f="50"
n="Arial"


sudo find . -iname "*.mp4" -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3" -vf \
"subtitles="${1%.*}.$4":'\''force_style=fontsize="$5",fontname="$6"'\''" \
-map_metadata -1 "$1.${1##*.}" -hide_banner' -- "{}" "$a" "$v" "$exts" "$f" "$n" \;

答案1

您是否考虑过以单引号结束该行,后跟反斜杠,并以单引号开始下一行(没有空格!),例如

...'\
'...

答案2

如果您的脚本使用 bash 而不是 sh,则可以使用数组来保存要查找的参数——数组文字中允许有任意空格。

find_args=(
    .
    -iname "*.mp4"
    -exec sh -c '
        ffmpeg \
            -i "$1" \
            -c:a "$2" \
            -c:v "$3" \
            -vf "subtitles=${1%.*}.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
            -map_metadata \
            -1 "$1.${1##*.}" \
            -hide_banner
    ' -- "{}" "$a" "$v" "$exts" "$f" "$n" \;
)

sudo find "${find_args[@]}"

如果您得到ffmpeg: not found,那么它位于不在 root 的 PATH 中的目录中。请改用 ffmpeg 的完整路径。

相关内容