Проблема с экранированием символов в скрипте bash - PullRequest
0 голосов
/ 23 апреля 2011

Я действительно новичок в сценарии bash, я пытаюсь создать сценарий оболочки для обработки видео с использованием cron, но я действительно не знаю, что происходит

#!/bin/bash

args=("$@")
count=0
startingfrom=5

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i"
args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'
args12="-r 29.97 -ss 00:40:30 -vsync 0 -vpre libx264-medium -i"
args3="-vcodec libx264 -acodec libfaac"

for file in /home/allen/s/
do


eppart1 = "$args[0]_$startingfrom_01_01_02.mp4"
eppart2 = "$args[0]_$startingfrom_01_02_02.mp4"

/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"

mv "${args[0]}_${startingfrom}_01_02_02.mp4" upload/



let "count += 1"
let "startingfrom +=1"
echo "$count"

echo ${args[0]}
echo ${args[1]}

done

/usr/local/bin/python2.5 /home/allen/s/process.py

Проблема начинается с этого аргумента

args2='-vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "'

Я не знаю, если это из-за специального символа или нет, обычно, если я набираю всю команду, она работает, но в скрипте bash это отличается

Вывод, который он даетme

Unable to find a suitable output format for 'scale=580:380'

Хотя, как я уже сказал, если я запускаю всю команду, она просто работает

Ответы [ 3 ]

0 голосов
/ 23 апреля 2011

В строке ниже есть две проблемы.Во-первых, вы не можете иметь пробелы вокруг равных.Во-вторых, когда вы пытаетесь использовать переменную в строке в двойных кавычках, вам нужно использовать фигурные скобки.

eppart1 = "$args[0]_$startingfrom_01_01_02.mp4"

Что вам нужно, это:

eppart1="$args[0]_${startingfrom}_01_01_02.mp4"

В противном случае, Bashбудет искать переменную, обозначенную startingfrom_01_01_02, а не startingfrom

Вы, кажется, исправили это в более поздних строках, так что, возможно, вы просто вставили старую версию?

Кроме этого,то, что сказали другие, правильно: вы не должны выполнять ничего, кроме присваиваний и откликов, пока не убедитесь, что ваши переменные верны.

0 голосов
/ 24 апреля 2011

Помещение кавычек в значение переменной (как вы сделали с 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" не нужно (поскольку они не содержат аргументов с пробелами в них), но это не повредит и может считаться хорошей практикой.

0 голосов
/ 23 апреля 2011

предваряет то, что будет выполнено с эхом, поэтому вы увидите, что будет передано командам;

           something $args2

расширится до

           something -vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50 [out] "

т.е. вызов чего-либо с двумя аргументами, один из которых является опцией (или двумя опциями), а другой - «одиночной» строкой; Я полагаю, вам не нужны двойные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...