我有一个想在文件夹上运行的自动化脚本。我希望脚本获取文件夹中的每个文件并在其上运行我的 shell 命令。Automator 设置为将输入传递给标准输入,但我认为我在下面没有正确使用标准输入,你能帮忙吗?
for f in "$@"
do
java -Xmx1000m -jar /Users/myprog/myprog.jar $f
done
当你说你“没有正确使用标准输入”时你是对的。事实上,根据您提供的脚本片段,您的脚本假定您在命令行上将文件作为参数获取......您根本没有使用标准输入!
在 Run Shell Script 操作的右上角,X 下方是一个带有 2 个选项的下拉框:'Pass input: to stdin' 和 'Pass intput: as arguments'。这些选项规定了如何将所选文件传递给您的脚本操作。如果选择了“作为参数”选项,您的脚本应使用以下模板
for f in "$@"; do
# so stuff here
done
This template is provided by the action itself when 'as arguments' is selected.
另一方面,如果选择了 'to stdin' 选项,那么你的脚本应该使用这个模板:
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
(如果您不了解 bash 脚本,那么行中 # 之后的所有内容都是注释)
请注意,脚本操作提供的模板是简单的单个命令
cat
在我看来不是很有帮助。
请注意,在您实际将文本输入到脚本区域之前,在“to stdin”和“as arguments”之间进行更改将更改脚本框的内容(我假设这是您的脚本应该是什么样子的提示)但是一旦您输入了一些东西,切换不再发生。
特殊变量$@
表示提供给脚本的所有命令行参数。
循环遍历每一个,for
每次都执行 jar 文件。您可以将脚本缩短为:
for f
do
java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done
因为 的默认行为for
是使用$@
.
如果参数中有空格,您应该在 java 命令末尾的 $f 周围加上引号。
根据我在这里看到的,您可以设置一个方便的“服务”,它允许您使用查找器中的上下文菜单右键单击和转换文件。
要进行此设置:
将现有文本“cat”替换为以下代码:
for f in "$@"; do
/usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
echo "$f converted"
done
注意:上述设置将转换为 16 位 @ 32000hz(LEI16@32000 = little endian 16 位)的单声道(-c 1 --mix)。在终端中使用 /usr/bin/afconvert -h 查看所有可用选项。
在编辑器的顶部,您应该会看到两个下拉菜单,按如下方式设置它们:
Service receives selected [Files and Folders] in [Finder.app]
在 Shell 脚本编辑器区域中,确保:
"Shell" is set to "/bin/bash"
和
"pass input" is set to "arguments"
保存诸如“转换为 CAF”之类的内容
我不确定我是否理解您的问题,因为您的脚本似乎没有使用标准输入。$@ 特殊参数扩展为在 argv 中作为参数传递的位置参数。它的工作方式与您以这种方式直接从 shell 调用脚本相同:
$ cat >test
for f in "$@"
do
echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c
如果您想从标准输入获取参数,您可以执行以下操作:
$ cat >test2
for f in $(cat)
do
echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c