将超过 10 个参数传递给 automator 中的 Sox shell 脚本

Pass more than 10 arguments to Sox shell script in automator

我在 Automator 中将参数(selected 查找器项)传递给 shell 脚本(将 wav 文件转换为 u-law wav 文件的 Sox 脚本)。我有两个问题:

如果 selected 的项目超过 10 个,shell 脚本将忽略前 10 个参数之后的任何内容,而且,正如脚本现在所处的那样,即使传递的参数少于 10 个arguments (finder items) shell 脚本将作用于除最后一个 selected 项目之外的所有项目。所以,如果我在 automator 中 select 3 个文件,前 2 个将通过,而不是第三个。或者如果我 select 4 个文件,3 个文件将通过 - 依此类推。

这是我的 Automator 操作命令

询问 Finder 项目

设置变量值

标记变量"input-files"

获取变量的值

获取变量"input-files"

运行 Shell 脚本

#! /bin/sh
soxloc="/usr/local/bin/sox";
tempfile="";

shopt -s nullglob

for f in "${@:1}"/*.wav
do
"$soxloc" "$f" -r 8000 -c 1 -e u-law "${f%.*}"-ulaw.wav
done

SO 上列出了一些解决方案,包括以下 link,但我只是不确定如何将这些解决方案中的任何一个集成到我的代码中:

How to handle more than 10 parameters in shell

如有任何帮助,我们将不胜感激!

表达式 "${@:1}" 扩展为作为参数传入的标记,然后您在末尾添加 /*.wav,导致最后一个标记与通配符的粘贴。使用 nullglob,如果没有匹配项,此模式将被替换为空。

(:1 名义上选择从第一个开始的参数,但无论如何这是默认值,所以这里是多余的;至少在我的 Bash.)

你可能想要这样的东西

for d in "$@"; do
  for f in "$d"/*.wav; do
    sox "$f" -r 8000 -c 1 -e u-law "${f%.*}"-ulaw.wav
  done
done

sox 放入变量中是一种反模式。如果它不在标准位置,则将(的目录部分)位置添加到循环之前的 PATH

这修复了 shell 脚本中的错误,因此它可以可靠地接受任意数量的参数;但是如果 Automator 有自己的限制,我不知道如何解决这个问题。