引用符の中にある長いコマンドラインを安全に切る方法はありますか?

引用符の中にある長いコマンドラインを安全に切る方法はありますか?

やや複雑なコマンドを書いた。なぜなら、複数の引用符' '" "引用符があるからです。そして脱出条件'\''(何らかの理由でその使い方は必須です。たくさん調べました)。\引用符で行を破ろうとしましたが、残りの部分がコマンドとして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

スクリプトがshの代わりにbashを使用している場合は、配列を使用して探している引数を保持できます。配列リテラルには任意のスペースを使用できます。

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ルートのPATHにないディレクトリにあるのです。代わりにffmpegのフルパスを使用してください。

関連情報