O que exatamente esse script faz? [duplicado]

2
#!/bin/bash

for a in ./*.flac; do
  ffmpeg -i "$a" -qscale:a 0 "${a[@]/%flac/mp3}"
done

Encontrei este script há alguns dias para converter todos os arquivos FLAC no diretório atual para o formato MP3.

O que eu não entendo aqui é a parte "${a[@]/%flac/mp3}" . Eu acho que substitui o flac final com mp3 para o nome do arquivo atual. Mas o que faz a [@] parte? É uma expressão regular?

    
por monkey2k 19.12.2016 / 18:54

2 respostas

4

Como você adivinhou, ${var/%flac/mp3} substitui o final "flac" (se houver) no valor $var com "mp3" . "${var[@]/%flac/mp3}" faria o mesmo em cada saída do elemento por ${var[@]} se var fosse uma matriz.

Aqui, como a não é uma matriz, você pode remover [@] (suponho que isso seja uma herança de tentativas anteriores do programador).

    
por 19.12.2016 / 19:05
2

Isso faz uma expansão de shell simples. A variável a irá percorrer todos os arquivos correspondentes ao *.flac glob.

Como cada entrada será um arquivo (e eu presumo que não há espaços nos nomes dos arquivos), foo.flac será a expansão de ambos $a e ${a[@]} .

A construção ${var/%foo/bar} substituirá foo por bar no final de uma variável var . Por isso, está substituindo a extensão flac pela extensão mp3 em seu exemplo para fornecer ffmpeg com o nome do arquivo de saída.

    
por 19.12.2016 / 19:06