Помещение кавычек в значение переменной (как вы сделали с args2) не дает ожидаемого результата. В частности, они будут анализироваться не как кавычки при использовании переменной, а как обычные символы. Так что если вы делаете:
args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'
somecmd $args2
получается эквивалентно:
somecmd '-vf' '"[in]' 'scale=580:380' '[T1],[T1]' 'pad=720:530:0:50' '[out]' '"'
обратите внимание, что двойные кавычки не интерпретируются как группировка слов, вместо этого они просто передаются команде как части слов - а не то, что вы хотите вообще. Кстати, это тот случай, когда отладка с помощью echo
не поможет - все будет хорошо, потому что echo
явно не разделяет получаемые аргументы. Вместо этого, используя set -x
, вы получите команду bash для печати команд по мере их выполнения с уточненным разбором.
Теперь об исправлении. Если вам нужно сохранить аргументы команды в переменной (как вы делаете здесь) и отслеживать, где находятся границы слов (как вы пытаетесь использовать двойные кавычки), стандартный ответ - использовать вместо этого массивы простых переменных. Создайте массив с каждым аргументом в качестве элемента массива, затем используйте массив с идиомой "${arrayname[@]}"
(обратите внимание, что двойные кавычки вокруг него очень важны). Вот мой пример выше:
args2=(-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] ")
somecmd "${args2[@]}"
или в вашем скрипте:
...
args2=(-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] ")
...
/usr/local/bin/ffmpeg $args1 "$file" "${args2[@]}" $args3 "${args[0]}_${startingfrom}_01_01_02.mp4"
mv "${args[0]}_${startingfrom}_01_01_02.mp4" upload/
/usr/local/bin/ffmpeg $args12 "$file" "${args2[@]}" $args3 "${args[0]}_${startingfrom}_01_02_02.mp4"
...
Кстати, делать то же самое с другими переменными "arg" не нужно (поскольку они не содержат аргументов с пробелами в них), но это не повредит и может считаться хорошей практикой.