まず、私はあなたがファイルのテキストsource
に必要とされていない推測しています.txtをスクリプトに追加します。ファイルのソースがsource filename
または. filename
の場合、ファイル内のコード行は、コマンド行で出力されたかのように実行されます。このように、私はあなたのスクリプトのこのセクションを削除しました。
第2に、他の人が述べたように、$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
いくつかの追加の注意事項を上記のスクリプトに:
バックスラッシュの解釈はエスケープと行継続で無効にするread
と-r
を使用することをお勧めします読み込まれたデータ。あなたの入力にbash
のエスケープ可能な文字がある場合、これは問題の疫病からあなたを守ります。
入力ファイルの最後の行に最後の文字として改行がないようにするために、while条件に|| [[ -n "${name}" ]]
を追加しました。それ以外の場合は、各行の最後に改行文字が必要なため、最後の行は標準の読み込みプロセスで無視されます。
bash組み込み変数$?
のチェックを追加しました。前のコマンドの戻り値は$?
に格納されます。 0
は成功を示し、その他はエラーを示します。
EDIT
あなたがやっている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
を編集が含まれます:
- jpegファイル名のtext.txtからフレーム番号を使用するようにスクリプトを合理化する。
- 有効
bash
set -x
を追加してデバッグを有効にします。
上記の変更されたスクリプトを使用すると、実行するたびにすべての出力をffmpeg
から見ることができます。私の模擬テストは、すべてがあなたの望む成果ごとに正しく機能しているはずであることを示しています。あなたはもう一度テストして結果を報告できますか?
'$ i'変数は空ですが、決して定義しません。あなたは何をしたいですか? – Jahid
見てください:http://www.shellcheck.net/ – Cyrus
$ 1は1,2,3-などの連続番号でもかまいません.... – JulianJ