2011-03-03 1 views
1

Je suis bloqué avec mon script bash avec array pour l'option de commande.Sortie de tableau pour l'option de commande dans le script bash

Je fais un script bash pour extraire les pièces jointes du fichier mkv, et à la fin fusionner à nouveau les pièces jointes au fichier mkv après le codage vidéo/audio.

C'est pour la fixation d'extrait

#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 

Et maintenant, pour la fusion à nouveau l'attachement

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[*]} 

Le problème, peut toujours pas pour le nom de fichier avec l'espace. Quand j'ai essayé écho le ${attachment[*]}, il semble bien

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

Mais la sortie reconnaissent toujours le nom du fichier avec l'espace que le premier mot.

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. 

Répondre

0

La réponse d'Ignacio vous dirigera dans la bonne direction, mais je voulais commenter certaines choses dans votre script.

Cette ligne a beaucoup de soubresauts inutiles:

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

Ici, il est simplifié:

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

Il est pas nécessaire d'utiliser un signe de dollar et accolades pour les indices de tableau:

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

En outre, $"" est utilisé pour créer des chaînes pour la traduction (i18n et l10n). Vous n'en avez probablement pas besoin ici. Cependant, c'est l'une des lignes que vous devriez changer parce que cela fait partie de votre problème. Vous constaterez que la ligne précédente à celle-ci avec la commande sed sera inutile.

Edit:

Si vous avez vraiment besoin d'utiliser un tableau:

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[@]}" 

Le tableau attachment résultant aura deux fois plus d'éléments que le tableau 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")' 
+0

merci pour simplifier le script, mais pour A = $ (mkvmerge -i input.mkv | wc -l), vous êtes absent pièce jointe grep -i, la ligne complète doit être A = $ (mkvmerge - i input.mkv | grep -i pièce jointe | wc -l) – dewaforex

+0

@dewaforex: Oups, désolé à ce sujet. Je suis trop zélé. –

+0

Non, problème. C'est plus simple maintenant, mais je n'arrive toujours pas à comprendre la dernière erreur quand on met double qoute sur "$ {attachment [*]}" qui pointait par la réponse d'Ignacio – dewaforex

Questions connexes