【问题标题】:Using apple's Automator to pass filenames to a shell script使用苹果的 Automator 将文件名传递给 shell 脚本
【发布时间】:2010-12-23 20:16:03
【问题描述】:

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

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

【问题讨论】:

    标签: shell scripting automator


    【解决方案1】:

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

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

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

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

    你应该在 java 命令的末尾加上引号,以防参数中有空格。

    【讨论】:

      【解决方案2】:

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

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

      如果您想从标准输入中获取参数,您可以执行以下操作:

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

      【讨论】:

        【解决方案3】:

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

        设置:

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

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

          注意:上面的设置将转换为 16 位 @ 32000hz(LEI16@32000 = little endian 16 位)的单声道(-c 1 --mix)。在终端中使用 /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”。

        【讨论】:

          【解决方案4】:

          当你说你“没有正确使用标准输入”时你是对的。事实上,根据您提供的脚本 sn-p,您的脚本假定您在命令行上将文件作为参数获取......您根本没有使用标准输入!

          在 Run Shell Script 操作的右上角,X 下方是一个下拉框,其中包含 2 个选项:“将输入:传递给标准输入”和“将输入:作为参数传递”。这些选项规定了如何将所选文件传递给您的脚本操作。如果选择了“作为参数”选项,您的脚本应使用以下模板

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

          此模板由“作为参数”选择的操作本身提供。

          另一方面,如果选择了 'to 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
          

          在我看来不是很有帮助。

          请注意,在您实际将文本输入到脚本区域之前,在“to stdin”和“as arguments”之间进行更改将更改脚本框的内容(我假设这是您的脚本应该是什么样子的提示)但是一旦你输入一些东西,切换不再发生。

          【讨论】:

            猜你喜欢
            • 2021-06-06
            • 1970-01-01
            • 2022-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多