2015-11-10 41 views
0

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

如果选择的项目超过10个,shell脚本会忽略超过前10个参数的任何内容,并且,即使在传递少于10个参数(finder项目)的情况下, shell脚本将对除最后一个选定项目以外的所有项目起作用。所以,如果我在automator中选择3个文件,前2个将会通过,而不是第三个。或者,如果我选择4个文件,3个文件将通过 - 等等。

这里是我的Automator动作命令

询问Finder项

的可变

标记变量 “输入文件”

设定值获取变量的值

得到变量“输入文件”

运行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

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

(该:1名义上选择从第一次开始争论,但那些是默认的,无论如何,所以这是多余这里,表达至少在我的Bash等同于简单的"[email protected]"。)

你可能打算像

for d in "[email protected]"; 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有其自身的限制,我不知道如何解决这个问题。

+0

谢谢!我按照建议简化了无关代码,并剔除了一些不必要的代码。它最终是这样的:'#!/bin/sh for f in“$ @”; do /usr/local/bin/sox“$ f”-r 8000 -c 1 -e u-law“$ {f%。*}” - ulaw.wav done' – Darbis

相关问题