我将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
非常感谢任何帮助!
答案 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有自己的限制,我不知道如何解决这个问题。