如何使用lame在shell脚本中编码wav文件?

问题描述:

我试图通过变量来设置艺术家信息,其中有空格。拉姆胡扯出来。也许我被bash推迟了?如何使用lame在shell脚本中编码wav文件?

#!/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=$ 

这里是脚本的输出。

[email protected]:~/ogg/noartist/unknown_disc$ ./encode.sh 
[email protected]:~/ogg/noartist/unknown_disc$ lame: excess arg The 
lame: excess arg The 

Lame抱怨每次循环迭代...当然。

我改变了脚本来回显循环的一个迭代,这就是输出的内容。

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

这工作线罚款壳...我很困惑。我在这里做错了什么?我知道它与我的变量中的空格有关,但我不知道如何解决它。

“跛脚”应该是一个功能。 注意:我在同一个目录“./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" 
=============================================== 

我发现,我用了一个临时的解决方案......

这是一个黑客攻击的一位,但它的工作:

#!/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 

的问题是线

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

,因为之后的$ lame不止一次被评估。您可以运行

bash -xv ./encode.sh 

查看执行的命令和变量替换(而不是运行“bash -xv”,您可以在脚本中添加“set -xv”)。