Passando caminhos e nomes de arquivos para um programa a partir do script bash

1

Eu uso um utilitário chamado mp3wrap que combina vários mp3s em um. Digamos que eu tenha um diretório "album 1" contendo três arquivos "track 1.mp3", "track 2.mp3" e "track 3.mp3". Eu vou executar o seguinte:

mp3wrap album\ 1.mp3 album\ 1/*.mp3

que combinará todas as três faixas no diretório "album 1" (o segundo argumento) em um novo arquivo "album 1.mp3" (o primeiro argumento).

Eu tenho um monte de diretórios como este, "album 2", "album 3" etc., e eu gostaria de escrever um script para automatizar o processo. Eu tentei isso:

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  

mas recebo o erro

1.mp3: No such file or directory

Parece que meu script expande $ i para "album 1.mp3", que é passado como dois argumentos separados. Depois de pesquisar e ler, acabei com isso:

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  

Agora eu não recebo uma mensagem de erro, em vez disso eu recebo a página "usage" do programa mp3wrap. Então, claramente, ele não está recebendo os argumentos da mesma maneira que quando executo o comando a partir da linha de comando, e não sei como verificar a aparência da linha de comando quando executada pelo script bash.

O que estou fazendo de errado? Qualquer ajuda apreciada!

    
por Brundlefly 15.08.2017 / 22:36

1 resposta

4

Você está perto disso. Aqui está o código correto:

for i in album*
do
    mp3wrap "${i}.mp3" "${i}"/*.mp3
done

Variáveis e argumentos devem ser quase sempre citados para evitar o primeiro problema. Pelo contrário, caracteres de globalização de shell como * e ? não devem, senão eles perdem seu significado especial.

    
por 15.08.2017 / 22:42