Вывод массива для опции команды в скрипте bash - PullRequest
1 голос
/ 03 марта 2011

Я застрял с моим bash-скриптом с массивом для опции команды.

Я создаю bash-скрипт для извлечения вложений из mkv-файла и в конце снова объединяю эти вложения в mkv-файл послевидео / аудио кодировались.

Это для извлечения вложения.

#find the total of attachment
A=$(mkvmerge -i input.mkv | grep -i attachment 
                          | awk '{printf $3 "\n"}' 
                          | sed 's;\:;;' 
                          | awk 'END { print NR }')

#extract it
for (( i=1; i<=$A; i++ ))
do
font[${i}]="$(mkvmerge -i input.mkv | grep -i attachment 
                                    | awk '{for (i=11; i <= NF; i++) printf($i"%c" , (i==NF)?ORS:OFS) }' 
                                    | sed "s/'//g" 
                                    | awk "NR==$i")"

mkvextract attachments input.mkv $i:"${font[${i}]}"
done

. А теперь для повторного слияния вложения.

for (( i=1; i<=$A; i++ ))
do
#seach for space between file name and and '\' before 
#the space because some attachment has space in filename
font1[${i}]=$(echo ${font[${i}]} | sed 's/ /\\ /g')
#make option for add attachment
attachment[${i}]=$"--attach-file ${font1[${i}]}"
done

mkvmerge -o output.mkv -d 1 -S test.mp4 sub.ass ${attachment[*]}

Проблема все еще не можетработа для имени файла с пробелом.Когда я попытался повторить ${attachment[*]}, кажется, все в порядке

--attach-file Beach.ttf --attach-file Candara.ttf 
                        --attach-file CASUCM.TTF 
                        --attach-file Complete\ in\ Him.ttf 
                        --attach-file CURLZ_.TTF 
                        --attach-file Frostys\ Winterland.TTF 
                        --attach-file stilltim.ttf

Но вывод все равно распознает имя файла с пробелом только первое слово.

mkvmerge v3.0.0 ('Hang up your Hang-Ups') built on Dec  6 2010 19:19:04
Automatic MIME type recognition for 'Beach.ttf': application/x-truetype-font
Automatic MIME type recognition for 'Candara.ttf': application/x-truetype-font
Automatic MIME type recognition for 'CASUCM.TTF': application/x-truetype-font
Error: The file 'Complete\' cannot be attached because it does not exist or cannot be read.

1 Ответ

0 голосов
/ 03 марта 2011

Ответ Игнасио укажет вам правильное направление, но я хотел прокомментировать некоторые вещи в вашем сценарии.

Эта строка имеет много бессмысленных вращений:

A=$(mkvmerge -i input.mkv | grep -i attachment | awk '{printf $3 "\n"}' | sed 's;\:;;' | awk 'END { print NR }')

Здесьэто упрощено:

A=$(mkvmerge -i input.mkv | grep -i attachment | wc -l)

Нет необходимости использовать знак доллара и фигурные скобки для индексов массива:

attachment[i]="--attach-file ${font1[i]}"

Кроме того, $"" используется для создания строк для перевода (i18nи l10n).Вам, вероятно, там не нужно.Тем не менее, это одна из строк, которую вы должны изменить, потому что это часть вашей проблемы.Вы обнаружите, что строка, предшествующая этой с командой sed, не понадобится.

Редактировать:

Если вам действительно нужно использовать массив:

for (( i=1; i<=A; i++ ))
do
    #make option for add attachment
    attachment+=("--attach-file" "${font1[i]}")
done

mkvmerge -o output.mkv -d 1 -S test.mp4 sub.ass "${attachment[@]}"

Полученный массив attachment будет иметь в два раза больше элементов, чем массив font1.

$ declare -p font1 attachment    # show the contents
declare -a font1='([0]="Beach.ttf" [1]="Candara.ttf" [2]="CASUCM.TTF" [3]="Complete" [4]="in" [5]="Him.ttf" [6]="CURLZ_.TTF" [7]="Frostys" [8]="Winterland.TTF" [9]="stilltim.ttf")'
declare -a attachment='([0]="--attach-file" [1]="Beach.ttf" [2]="--attach-file" [3]="Candara.ttf" [4]="--attach-file" [5]="CASUCM.TTF" [6]="--attach-file" [7]="Complete in Him.ttf" [8]="--attach-file" [9]="CURLZ_.TTF" [10]="--attach-file" [11]="Frostys Winterland.TTF" [12]="--attach-file" [13]="stilltim.ttf")'
...