Как я могу использовать lame для кодирования файлов WAV в сценарии оболочки? - PullRequest
2 голосов
/ 14 апреля 2009

Я пытаюсь установить информацию об исполнителе через переменные с пробелами в них. Хромой вываливается. Может быть, меня задерживают с помощью bash?

#!/bin/bash
year=2008;
artist="New Kids On The Block";
album="The Block";
bitrate=320;
lame="lame -b $bitrate --ta \"$artist\"  --tl \"$album\" --ty $year"

function first_half
{
    for (( i=1;i<10;i++ )); do
        $lame "track_0$i.wav" "track_0$i.mp3";
    done;
}

function second_half
{
    for (( x=10;x<18;x++ )); do
        echo $lame "track_$x.wav" "track_$x.mp3";
    done;
}

first_half &
first_pid=$!

#second_half &
#second_pid=$

Вот вывод сценария.

user@host:~/ogg/noartist/unknown_disc$ ./encode.sh 
user@host:~/ogg/noartist/unknown_disc$ lame: excess arg The
lame: excess arg The

Хромая жалуется на каждую итерацию цикла ... конечно.

Я изменил скрипт для вывода одной из итераций цикла, и это то, что выводится.

lame -b 320 --ta "New Kids On The Block" --tl "The Block" --ty 2008 track_01.wav track_01.mp3

Это прекрасно работает на оболочке ... Я в замешательстве. Что я здесь не так делаю? Я знаю, что это связано с пробелами в моих переменных, но я не уверен, как это исправить.

Ответы [ 3 ]

1 голос
/ 15 апреля 2009

Проблема в линии

lame="lame -b $bitrate --ta \"$artist\"  --tl \"$album\" --ty $year"

потому что позже $ lame оценивается более одного раза. Вы можете запустить

bash -xv ./encode.sh

чтобы увидеть выполненные команды и подставленные переменные (вместо запуска "bash -xv" вы можете добавить "set -xv" внутри скрипта).

1 голос
/ 15 апреля 2009

«Хромой» должен быть функцией. Примечание: я запустил "lame" в том же каталоге, "./lame", поэтому я мог использовать другой скрипт для проверки результатов.

#!/bin/bash
year=2008
artist="New Kids On The Block"
album="The Block"
bitrate=320

function lame()
{
#local bitrate=$1
#local artist=$2
#local album=$3
#local year=$4
local in=$1
local out=$2
./lame -b "$bitrate" --ta "$artist" --tl "$album" --ty "$year" "$in" "$out"
}

function first_half
{
    for (( i=1;i<10;i++ )); do
        lame "track_0$i.wav" "track_0$i.mp3"
    done
}

first_half &
first_pid=$!

хромает:

#!/bin/bash

echo ===============================================
echo $0 $*
echo "0 ==> \"$0\""

CNT=1
while true; do
  echo -n "$CNT "
  [ $CNT -lt 10 ] && echo -n " "
  echo "==> \"$1\""
  CNT=$(($CNT + 1))
  shift
  [ -z "$1" ] && break
done

echo ===============================================

Пример вывода (частичный):

===============================================
./lame -b 320 --ta New Kids On The Block --tl The Block --ty 2008 track_01.wav track_01.mp3
0 ==> "./lame"
1  ==> "-b"
2  ==> "320"
3  ==> "--ta"
4  ==> "New Kids On The Block"
5  ==> "--tl"
6  ==> "The Block"
7  ==> "--ty"
8  ==> "2008"
9  ==> "track_01.wav"
10 ==> "track_01.mp3"
===============================================
===============================================
./lame -b 320 --ta New Kids On The Block --tl The Block --ty 2008 track_02.wav track_02.mp3
0 ==> "./lame"
1  ==> "-b"
2  ==> "320"
3  ==> "--ta"
4  ==> "New Kids On The Block"
5  ==> "--tl"
6  ==> "The Block"
7  ==> "--ty"
8  ==> "2008"
9  ==> "track_02.wav"
10 ==> "track_02.mp3"
===============================================
0 голосов
/ 14 апреля 2009

Я нашел временное решение, которое использовал ...

Это что-то вроде хака, но это делает работу:

#!/bin/bash
year="2008";
artist="\"New Kids On The Block\"";
album="\"The Block\"";
bitrate=320;
genre="Pop";
lame="lame -b $bitrate --ta $artist  --tl $album --ty $year --tg $genre"

function first_half
{
    echo "Encoding first half...";
    for (( i=1;i<10;i++ )); do
        echo $lame "track_0$i.wav" "track_0$i.mp3" > run1.sh;
        bash run1.sh >/dev/null 2>/dev/null;
    done;
    rm -f run1.sh;
}

function second_half
{
    echo "Encoding second half too...";
    for (( x=10;x<18;x++ )); do
        echo $lame "track_$x.wav" "track_$x.mp3" >run2.sh;
        bash run2.sh >/dev/null 2>/dev/null;
    done;
    rm -f run2.sh;
}

first_half &
echo $! > first_half.pid

second_half
echo $! > second_half.pid

echo "Done!";
rm *.pid -f
...