使用apple的Automator将文件名传递给shell脚本

时间:2009-12-06 23:41:19

标签: shell scripting automator

我有一个我想在文件夹上运行的自动播放器脚本。我希望脚本获取文件夹中的每个文件并在其上运行我的shell命令。 Automator设置为将输入传递给stdin,但我不认为我正在下面正确使用stdin,你能帮忙吗?

for f in "$@" 
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done

4 个答案:

答案 0 :(得分:10)

特殊变量$@表示提供给脚本的所有命令行参数。

for循环遍历每个循环并每次执行jar文件。您可以将脚本缩短为:

for f
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done

因为for的默认行为是使用$@

如果参数中有空格,你应该在java命令的末尾加上$ f的引号。

答案 1 :(得分:8)

当你说你没有正确使用stdin"时,你就会纠正。实际上,从您提供的脚本片段中,您的脚本假定您在命令行中将文件作为参数获取...您根本不使用stdin!

在Run Shell Script操作的右上角,X下方是一个带有2个选项的下拉框:' Pass input:to stdin'和'传递输入:作为参数'。这些选项决定了如何将选定的文件传递给脚本操作。如果选项'作为参数'如果选中,您的脚本应使用以下模板

for f in "$@"; do
# so stuff here
done

当'作为参数时,该模板由动作本身提供。被选中。

另一方面,如果'到stdin'选择了选项,然后您的脚本应该使用此模板:

while read fname; do  # read each line - assumes one file name per line
   # do clever stuff with the filename
   echo $fname # to illustrate we'll simply copy the filename to stdout
done

(如果您不知道bash脚本,那么#在一行之后的所有内容都是评论)

请注意,脚本操作提供的模板是简单的单个命令

cat

我认为不是很有帮助。

请注意,在您实际在脚本区域中输入文本之前,请在'到stdin'之间切换。和'作为参数'将更改脚本框的内容(我假设这是您的脚本应该是什么样子的提示)但是一旦输入内容,就不再发生切换。

答案 2 :(得分:5)

根据我在这里看到的内容,您可以设置一个方便的“服务”,允许您使用查找器中的上下文菜单右键单击和转换文件。

进行设置:

  • 启动Automator
  • 从主菜单中选择“新建”
  • 选择“服务”(齿轮图标)
  • 将左侧库中的“Utilities - > Run Shell Script”拖放到主“编辑器”区域。
  • 使用以下代码替换现有文本“cat”:

    for f in "$@"; do
        /usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
        echo "$f converted"
    done
    

    注意:上面的设置将转换为16位@ 32000hz的单声道(-c 1 --mix)(LEI16 @ 32000 =小端16位)。在终端使用/ usr / bin / afconvert -h查看所有可用选项。

  • 在编辑器的顶部,你应该看到两个下拉菜单,按如下方式设置:

    Service receives selected [Files and Folders] in [Finder.app]
    
  • 在Shell脚本编辑器区域中,确保:

    "Shell" is set to "/bin/bash"
    

    "pass input" is set to "arguments" 
    
  • 保存类似“转换为CAF”的内容

  • 导航到其中包含一些WAV的文件夹。
  • 右键单击WAV,您应该会在上下文菜单的底部看到“转换为CAF”。

答案 3 :(得分:2)

我不确定我理解你的问题,因为你的脚本似乎没有使用stdin。 $@ special parameter扩展为在argv中作为参数传递的位置参数。它的工作方式与以这种方式直接从shell调用脚本的方式相同:

$ cat >test
for f in "$@"
do
  echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c

如果你想从stdin获取参数,你可以做这样的事情:

$ cat >test2
for f in $(cat)
do
  echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c