我想要做什么:以文件列表作为参数启动我的脚本。在我的脚本中,我想启动 xterm,用这些文件启动 mplayer。
我尝试了几件事。我这样称呼我的脚本:
myscript.sh *
这文件的命名类似于
"aaa AAA"
"bbb BBB"
"ccc DDD"
(即带空格的文件名)并且是可使用 mplayer 播放的声音、音乐或视频。
这就是我尝试过的
以下命令全部写入在我的脚本里面!
我试过:
下列作品。文件被打印。
ls -l $@
下列作品。文件被打印。
IFS='\n' ls -l $*
下列作品。文件被打印。奇怪的是我不需要
IFS='\n'
这里。为什么?xterm -e 'ls -l $*; read'
这才不是找到文件。
FILES=$@ ls -l $FILES
这才不是找到文件。这里所有文件名都被视为一个长文件名。 (???)
IFS='\n' FILES=$@ ls -l $FILES
这才不是找到文件。
export FILES=$@ ls -l $FILES
但以下作品。文件被打印。
IFS='\n' export FILES=$@ ls -l $FILES
现在用mplayer。
这作品。
IFS='\n' export FILES=$@ mplayer $FILES
这才不是工作。但为什么 2 号会
ls -l
起作用呢?这里 mplayer 退出打印它的帮助,就好像我刚开始时mplayer
没有参数一样。xterm -e 'mplayer $*; read'
这才不是工作。对于文件名中带有空格的所有文件,它都会失败。
IFS='\n' FILES=$@ xterm -e 'mplayer $FILES; read'
问题:如何使用保存在$FILES
变量中的文件从自己的 xterm 启动 mplayer?
答案1
如果您想将脚本的参数传递给 mplayer,在 xterm 中,这应该可以工作:
#!/bin/sh
xterm -e mplayer "$@"
这之所以有效,是因为"$@"
扩展方式:每个项目一个参数。xterm
做不是尝试以任何方式解释命令的参数;它只是让他们通过。
如果您实际上需要将文件列表放入变量中,最好的选择是使用数组变量。例如:
#!/bin/bash
declare -a FILES
for f; do
if [ -r "$f" ]; then
FILES+=("$f")
fi
done
xterm -e mplayer "${FILES[@]}"
上面的代码过滤了文件,仅传递可读的文件。这只是一个示例,通常您不会执行此类过滤。另外,通常我会使用小写变量名称,除非我打算导出它。
PS:根据您正在做的事情,您是否了解 mplayer 的-slave
模式?