如何从我的 shell 脚本 xterm 开始,它启动 mplayer 并播放作为脚本参数的文件

如何从我的 shell 脚本 xterm 开始,它启动 mplayer 并播放作为脚本参数的文件

我想要做什么:以文件列表作为参数启动我的脚本。在我的脚本中,我想启动 xterm,用这些文件启动 mplayer。

我尝试了几件事。我这样称呼我的脚本:

myscript.sh *

文件的命名类似于

"aaa AAA"
"bbb BBB"
"ccc DDD"

(即带空格的文件名)并且是可使用 mplayer 播放的声音、音乐或视频。

这就是我尝试过的

以下命令全部写入在我的脚本里面!

我试过:

  1. 下列作品。文件被打印。

    ls -l $@
    
  2. 下列作品。文件被打印。

    IFS='\n'
    ls -l $*
    
  3. 下列作品。文件被打印。奇怪的是我不需要IFS='\n'这里。为什么?

    xterm -e 'ls -l $*; read'
    
  4. 才不是找到文件。

    FILES=$@
    ls -l $FILES
    
  5. 才不是找到文件。这里所有文件名都被视为一个长文件名。 (???)

    IFS='\n'
    FILES=$@
    ls -l $FILES
    
  6. 才不是找到文件。

    export FILES=$@
    ls -l $FILES
    
  7. 但以下作品。文件被打印。

    IFS='\n'
    export FILES=$@
    ls -l $FILES
    

现在用mplayer。

  1. 作品

    IFS='\n'
    export FILES=$@
    mplayer $FILES
    
  2. 才不是工作。但为什么 2 号会ls -l起作用呢?这里 mplayer 退出打印它的帮助,就好像我刚开始时mplayer没有参数一样。

    xterm -e 'mplayer $*; read'
    
  3. 才不是工作。对于文件名中带有空格的所有文件,它都会失败。

    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模式?

相关内容