分页: 1 / 1

mplayer与while

发表于 : 2012-07-11 17:41
giveup
下载了几个wma格式文件,想转成MP3格式,放在播放器中。
写了个脚本,结果,下面的这个执行中流程错误,只能转换第一个文件,然后就退出。确定是由于mplayer行引起的。

代码: 全选

#!/bin/bash

find *.wma  |while read fl
do 
echo "$fl" 
bfn=`basename "$fl" .wma`
mplayer -ao pcm:file="$bfn.wav" "$bfn.wma"
lame -h "$bfn.wav" "$bfn.mp3" 
rm -f "$bfn.wav"
echo "$fl -> $bfn.mp3 "
done
将while循环改成for,执行正确:

代码: 全选

#!/bin/bash

for fl in *.wma  
do 
echo "$fl" 
bfn=`basename "$fl" .wma`
mplayer -ao pcm:file="$bfn.wav" "$bfn.wma"
lame -h "$bfn.wav" "$bfn.mp3" 
rm -f "$bfn.wav"
echo "$fl -> $bfn.mp3 "
done
这是为什么呢?man mplayer没有发现返回值。
环境:ubuntu 12.04lts :em06

Re: mplayer与while

发表于 : 2012-07-11 17:50
枫叶饭团
为什么确定是mplayer引起的

Re: mplayer与while

发表于 : 2012-07-11 18:12
giveup
错误的脚本上只注释掉或者加上echo 含有mplayer行,就能重复3遍,列举目录下3个文件;只注释掉lame, rm结果一样;否则执行一遍,不重复,只能编码1个文件。
因此说是由于mplaer引起的。

Re: mplayer与while

发表于 : 2012-07-11 18:17
枫叶饭团
我觉得这两个脚本的不同之处只在于变量的获取方式。。。

Re: mplayer与while

发表于 : 2012-07-11 19:14
lilydjwg
mplayer 会读标准输入的。

Re: mplayer与while

发表于 : 2012-07-11 19:56
giveup
lilydjwg 写了:mplayer 会读标准输入的。
很有意思!
在mplayer行后添加标准输入转向后,原来错误的脚本居然执行正常了!

mplayer -ao pcm:file="$bfn.wav" "$bfn.wma" </dev/null

猜测,mplayer将标准输入重置,导致read第2次执行时返回空值? for语句不存在执行read的问题。确实也是变量获取方式造成的小问题。 :em05

Re: mplayer与while

发表于 : 2012-07-11 21:10
aerofox
能说是把标准输入重置,是它把所以标准输入的数据都“吃”下去了。

Re: mplayer与while

发表于 : 2012-07-13 12:56
giveup
关键是这种类似的脚本编程错误太隐蔽了,不好调试。

Re: mplayer与while

发表于 : 2012-07-16 14:39
biaozy
同样的问题还有,ssh与while时,原因都是一样的,标准输入重定向即可。