2015-11-10 40 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

相關問題