Проблема с арифметикой в ​​скриптах bash - PullRequest
3 голосов
/ 09 июля 2011

Я пытаюсь разрезать видео на 2-минутные клипы, используя FFMpeg.Я использую Ubuntu 10.10.

Вот мой код:

#!/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

Я + дважды проверен, но все еще не знаю почему,У меня седые волосы на этом.

1 Ответ

4 голосов
/ 09 июля 2011

Синтаксис ((MIN=MIN-2)), который вы используете, специфичен для bash.

У меня нет Ubuntu 10.10 для тестирования, но я думаю, что ваш /bin/sh это не bash, а меньшая и более простая оболочка с только базовыми функциями, необходимыми для POSIX.(В этом случае ((MIN=MIN-2)), вероятно, запускает суб-оболочку, которая запускает суб-оболочку, которая ничего не делает, кроме как устанавливает переменную MIN в строку MIN-2 и затем завершается.)

Попробуйте#!/bin/bash вместо первой строки.

...