mplayer与while

sh/bash/dash/ksh/zsh等Shell脚本
回复
giveup
帖子: 127
注册时间: 2009-08-31 17:21

mplayer与while

#1

帖子 giveup » 2012-07-11 17:41

下载了几个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
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: mplayer与while

#2

帖子 枫叶饭团 » 2012-07-11 17:50

为什么确定是mplayer引起的
giveup
帖子: 127
注册时间: 2009-08-31 17:21

Re: mplayer与while

#3

帖子 giveup » 2012-07-11 18:12

错误的脚本上只注释掉或者加上echo 含有mplayer行,就能重复3遍,列举目录下3个文件;只注释掉lame, rm结果一样;否则执行一遍,不重复,只能编码1个文件。
因此说是由于mplaer引起的。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: mplayer与while

#4

帖子 枫叶饭团 » 2012-07-11 18:17

我觉得这两个脚本的不同之处只在于变量的获取方式。。。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: mplayer与while

#5

帖子 lilydjwg » 2012-07-11 19:14

mplayer 会读标准输入的。
giveup
帖子: 127
注册时间: 2009-08-31 17:21

Re: mplayer与while

#6

帖子 giveup » 2012-07-11 19:56

lilydjwg 写了:mplayer 会读标准输入的。
很有意思!
在mplayer行后添加标准输入转向后,原来错误的脚本居然执行正常了!

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

猜测,mplayer将标准输入重置,导致read第2次执行时返回空值? for语句不存在执行read的问题。确实也是变量获取方式造成的小问题。 :em05
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: mplayer与while

#7

帖子 aerofox » 2012-07-11 21:10

能说是把标准输入重置,是它把所以标准输入的数据都“吃”下去了。
giveup
帖子: 127
注册时间: 2009-08-31 17:21

Re: mplayer与while

#8

帖子 giveup » 2012-07-13 12:56

关键是这种类似的脚本编程错误太隐蔽了,不好调试。
biaozy
帖子: 1
注册时间: 2012-07-16 14:36

Re: mplayer与while

#9

帖子 biaozy » 2012-07-16 14:39

同样的问题还有,ssh与while时,原因都是一样的,标准输入重定向即可。
回复