![有没有办法安全地中断引号内的长命令行?](https://linux22.com/image/13180/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%AE%89%E5%85%A8%E5%9C%B0%E4%B8%AD%E6%96%AD%E5%BC%95%E5%8F%B7%E5%86%85%E7%9A%84%E9%95%BF%E5%91%BD%E4%BB%A4%E8%A1%8C%EF%BC%9F.png)
我写了一个有点复杂的命令。因为有几个' '
和" "
引号。以及转义条件'\''
(由于某些原因,该用法是强制性的。我研究了很多)。我尝试用\
任何引号来打破该行,我遇到了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 的完整路径。