【问题标题】:Pass more than 10 arguments to Sox shell script in automator将 10 多个参数传递给 automator 中的 Sox shell 脚本
【发布时间】:2015-11-10 07:17:14
【问题描述】:

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

如果选择的项目超过 10 个,shell 脚本会忽略前 10 个参数之后的任何内容,而且,就目前脚本而言,即使传递的参数少于 10 个(查找器项目),shell 脚本也会执行除了最后一个选定的项目之外的所有项目。所以,如果我在 automator 中选择 3 个文件,前 2 个将通过,而不是第三个。或者如果我选择 4 个文件,3 个文件将通过 - 等等。

这是我的 Automator Action 命令

询问 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

任何帮助将不胜感激!

【问题讨论】:

    标签: bash shell parameter-passing automator sox


    【解决方案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 有自己的限制,我不知道如何解决。

    【讨论】:

    • 谢谢!我按照建议简化了无关代码,并删除了一些不需要的代码。结果是这样的:#! /bin/sh for f in "$@"; do /usr/local/bin/sox "$f" -r 8000 -c 1 -e u-law "${f%.*}"-ulaw.wav done
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 2022-11-04
    • 2022-06-11
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多