Bash
從“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
命令。但是當我想嘗試更複雜的東西時,比如命令替換 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
腳本中的每個內部。'\''``'"'"'
這是為了
- 暫時跳出單引號字元串(第一個
'
結束'\''
單引號字元串),- 插入一個文字
'
(\'
in'\''
,您也可以將其寫為"'"
,但引號太多,使其不可讀),然後- 將其與剩餘的原始單引號字元串連接起來(最後一個
'
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 ...