2011-07-09 5 views
3

FFMpegを使用して2分のクリップにビデオをカットしようとしています。私はUbuntu 10.10を使用しています。bashスクリプトでの算術の問題

#!/bin/sh 
COUNTER=0 
BEG=0 
MIN=`ffmpeg -i ${1} 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | cut -d ":" -f 2` 
echo $MIN 
((MIN=MIN-2)) 
before_last_dot=${1%.*}; 
while [ $COUNTER -lt $MIN ]; do 
    ((BEG=COUNTER*60)) 
    echo "MIN:${MIN}" 
    echo "ffmpeg -sameq -i ${1} -ss ${BEG} -t 120 ${before_last_dot}.${COUNTER}.wmv" 
    ((COUNTER=COUNTER+2)) 
done

echo "ffmpeg -sameq -i ${1} -ss ${BEG} -t 120 ${before_last_dot}.${COUNTER}.wmv"ffmpeg -sameq -i ${1} -ss ${BEG} -t 120 ${before_last_dot}.${COUNTER}.wmv次のようになります。

は、ここに私のコードです。私はそれを確認するためにそれを印刷します。 $ {1}は動画の名前です。

しかし、問題は、((COUNTER=COUNTER+2))または((COUNTER+=2))は動作しません。 COUNTERは常に0ですが、BEGも常に0です。 ((MIN=MIN-2))もうまくいきません。 let: not found

I +ダブルチェックしましたが、まだ、なぜ知らない:

は、私はエラーを取得する let "MIN-=2"((MIN=MIN-2))を交換しようとしました。私はこれで灰色の髪を取得しています。

+1

デバッグフラグ-xでスクリプトを実行しようとしましたか? '#!/ bin/sh -x'各コマンドの結果をエコーし​​ます – bbaja42

+0

'/bin/sh'はbashですか? – Orbling

+0

おそらくあなたはbashを実行していないでしょうか?最初の行を '#!/ bin/bash'に変更してみてください – Martin

答えて

4

((MIN=MIN-2))の構文は、bash固有の機能です。

私はUbuntu 10.10でテストすることはできませんが、/bin/shbashではありませんが、POSIXで必要とされる基本的な機能だけを備えたより小さく簡単なシェルだと思います。 (その場合には、((MIN=MIN-2))は、おそらく何もしませんが、文字列MIN-2してから出口までの変数MINを設定し、サブシェルを起動している、サブシェルを起動します。)

代わりに、最初の行に#!/bin/bashを試してみてください。

+0

+1、ubuntuで検証、 '/ bin/sh'はダッシュを指します – bbaja42

+0

うん。私は 'cd/bin'と' sh->ダッシュ 'を参照してください。 – DocWiki