2015-11-10 2 views
0

Я передаю аргументы (выбранные элементы поиска) в Automator, в сценарий оболочки (скрипт Sox для преобразования wav-файлов в wav-файлы u-law). У меня возникли две проблемы:Передайте более 10 аргументов скрипту оболочки Sox ​​в automator

Если выбрано более 10 элементов, сценарий оболочки игнорирует все, что находится за первым 10 аргументами, а также, поскольку скрипт стоит прямо сейчас, даже при передаче менее 10 аргументов (элементов поиска) сценарий оболочки будет действовать на всех, кроме последнего выбранного элемента. Итак, если я выберу 3 файла в автомате, первые 2 пройдут, а не третье. Или, если я выберу 4 файла, 3 файла сделают это - и так далее.

Вот мой Automator порядок действий

Спросите пунктов Finder

Установить значение переменной

помеченных переменных "входных-файлов"

Получить значение переменной

получить переменные «ввод-файлы»

Run Shell Script

#! /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 этот шаблон будет заменен ничем, если совпадений нет.

(The :1 номинально выбирает аргументы, начиная с первого, но это по умолчанию в любом случае, так что лишняя здесь, выражение эквивалентно более простой "[email protected]" по крайней мере, в моем Bash.)

Вы, вероятно, собираетесь что-то вроде

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 перед циклом, если он не находится в стандартном расположении.

Это исправляет ошибки в сценарии оболочки, чтобы он надежно принимал произвольное количество аргументов; но если у Automator есть собственный лимит, я не знаю, как это исправить.

+0

Спасибо! Я упростил внешний код, как было предложено, а также вынул несколько ненужных. Это закончилось так: '#!/bin/sh для f в "$ @"; do /usr/local/bin/sox "$ f" -r 8000 -c 1 -e u-law "$ {f%. *}" - ulaw.wav done' – Darbis

Смежные вопросы