2011-07-09 150 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))从来没有工作过。

我试图取代((MIN=MIN-2))let "MIN-=2"我得到一个错误:let: not found

我+ VE双重检查,但仍然不知道为什么。这件事我得到了灰头发。

+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/sh不是bash,而是一个更小,更简单的外壳,只有POSIX所需的基本功能。 (在这种情况下,可能((MIN=MIN-2))启动一个子shell,这将启动一个子shell,它不只是设置一个变量MIN字符串MIN-2,然后退出。)

在第一行尝试#!/bin/bash代替。

+0

+1,在ubuntu上验证过,'/ bin/sh'指向破折号 – bbaja42

+0

是的。我'cd/bin'并看到'sh - > dash'。 – DocWiki