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

时间:2015-11-10 07:17:15

标签: bash shell parameter-passing automator sox

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

如果选择了10个以上的项目,那么shell脚本会忽略前10个参数之外的任何内容,而且,正如脚本现在所说的那样,即使传递少于10个参数(finder items),shell脚本也会执行操作除了最后选择的项目之外所以,如果我在automator中选择3个文件,前2个将通过,而不是第3个。或者,如果我选择4个文件,则会有3个文件通过 - 依此类推。

这是我的Automator Action订单

询问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上列出了一些解决方案,包括以下链接,但我不确定如何将这些解决方案集成到我的代码中:

How to handle more than 10 parameters in shell

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

表达式"${@: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有自己的限制,我不知道如何解决这个问题。