首先,我猜你是不是需要給source
文件文本.txt在您的腳本中。當文件來自source filename
或. filename
時,文件中的代碼行就像在命令行中打印一樣執行。因此,我已經刪除了你的腳本的這一部分。其次,正如其他人所指出的那樣,您沒有定義或更新$i
變量。的修改爲這樣可能會爲你工作:在上面的腳本
#!/bin/bash
i="0"
while read -r name || [[ -n "${name}" ]]; do # allows for last line with no newline
ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,${name})'" -vframes 1 frames-${i}.jpg
if [ "$?" -eq "0" ]; then
printf -- 'ffmpeg succeeded - creating frames-%s.jpg for %s\n' "${i}" "${name}"
else
printf -- 'ffmpeg failed - was unable to create frames-%s.jpg for %s\n' "${i}" "${name}"
fi
let i+="1"
done <text.txt
一些其他注意事項:
建議使用-r
與read
禁用反斜線的解釋逃走了續行中數據讀取。如果您的輸入有可能會出現bash
字符,這可以讓您免受問題的困擾。
我將|| [[ -n "${name}" ]]
添加到while條件中,以允許輸入文件中的最後一行沒有換行符作爲最後一個字符。否則,最後一行將被標準讀取過程忽略,因爲它需要每行末尾有一個換行符。
我添加了一個bash內建變量$?
的檢查。前一個命令的返回值存儲在$?
中。 0
表示成功,其他表示錯誤。
編輯
如果你想幫助解決什麼的ffmpeg是幹什麼的,你可以試試下面的修改後的腳本:
#!/bin/bash
set -x # activate bash debugging output
while read -r frame_number || [[ -n "${frame_number}" ]]; do # allows for last line with no newline
ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,${frame_number})'" -vframes 1 frames-${frame_number}.jpg
if [ $? -eq 0 ]; then
printf -- 'ffmpeg succeeded - creating frames-%s.jpg\n' "${frame_number}"
else
printf -- 'ffmpeg failed - was unable to create frames-%s.jpg\n' "${frame_number}"
fi
done <text.txt
的修改包括:
- 簡化腳本以使用text.txt中的幀編號作爲jpeg文件名。
- 啓用
bash
調試加入set -x
。
使用上面修改的腳本,您應該能夠在每次運行時看到ffmpeg
的所有輸出。我的模擬測試表明,每個人都應該按照您期望的結果正確運行。你能再次測試並報告你的發現嗎?
'$ i'變量是空的,你從來沒有定義它。你想要什麼? – Jahid
請看看:http://www.shellcheck.net/ – Cyrus
$ 1可能是一個連續的數字,例如1,2,3 .... – JulianJ