Joh*_*n 13 shell scripting automator
我有一个automator脚本,我想在一个文件夹上运行.我希望脚本获取文件夹中的每个文件并在其上运行我的shell命令.Automator设置为将输入传递给stdin,但我不认为我正在下面正确使用stdin,你能帮忙吗?
for f in "$@"
do
java -Xmx1000m -jar /Users/myprog/myprog.jar $f
done
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 10
特殊变量$@
表示提供给脚本的所有命令行参数.
在for
通过每一个循环的步骤和执行每一次的jar文件.您可以将脚本缩短为:
for f
do
java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done
Run Code Online (Sandbox Code Playgroud)
因为默认行为for
是使用$@
.
如果参数中有空格,你应该在java命令的末尾加上$ f的引号.
小智 10
当你说你"没有正确使用stdin"时,你是对的.实际上,从您提供的脚本片段中,您的脚本假定您在命令行中将文件作为参数获取...您根本就没有使用stdin!
在Run Shell Script操作的右上角,X下面是一个带有2个选项的下拉框:'传入输入:到stdin'和'传递输入:作为参数'.这些选项决定了如何将选定的文件传递给脚本操作.如果选择"作为参数"选项,则脚本应使用以下模板
for f in "$@"; do
# so stuff here
done
Run Code Online (Sandbox Code Playgroud)
当选择'as arguments'时,该模板由动作本身提供.
另一方面,如果选择了'to stdin'选项,那么您的脚本应该使用此tamplate:
while read fname; do # read each line - assumes one file name per line
# do clever stuff with the filename
echo $fname # to illustrate we'll simply copy the filename to stdout
done
Run Code Online (Sandbox Code Playgroud)
(如果您不知道bash脚本,那么#行上的所有内容都是注释)
请注意,脚本操作提供的模板是简单的单个命令
cat
Run Code Online (Sandbox Code Playgroud)
在我看来不是很有帮助.
请注意,在您实际在脚本区域中输入文本之前,在'to stdin'和'as arguments'之间进行更改将更改脚本框的内容(我假设这是对脚本应该是什么样子的提示)但是一旦输入内容,切换不再发生.
根据我在这里看到的内容,您可以设置一个方便的"服务",它允许您使用查找器中的上下文菜单右键单击和转换文件.
要设置它:
使用以下代码替换现有文本"cat":
for f in "$@"; do
/usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
echo "$f converted"
done
Run Code Online (Sandbox Code Playgroud)
注意:上面的设置将转换为16位@ 32000hz的单声道(-c 1 --mix)(LEI16 @ 32000 =小端16位).在终端中使用/ usr/bin/afconvert -h查看所有可用选项.
在编辑器的顶部,你应该看到两个下拉菜单,设置如下:
Service receives selected [Files and Folders] in [Finder.app]
Run Code Online (Sandbox Code Playgroud)在Shell脚本编辑器区域中,确保:
"Shell" is set to "/bin/bash"
Run Code Online (Sandbox Code Playgroud)
和
"pass input" is set to "arguments"
Run Code Online (Sandbox Code Playgroud)保存像"转换为CAF"之类的东西