Bash

從“find”啟動的“sh -c”腳本中的單引號問題

  • January 5, 2020

現在我在寫一個腳本很長一段時間,但最近這個問題讓我發瘋了。我嘗試了一切,但無法解決。

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命令。但是當我想嘗試更複雜的東西時,比如命令替換 last variable {}.$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

單引號字元串永遠不能包含單引號。

在您的情況下,解決這個難題的方法是用(或)替換內'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 ...

引用自:https://unix.stackexchange.com/questions/560479