如何向osascript传递多个参数?

5
我有一个使用osascript命令的shell脚本,内容如下:
#!/usr/bin/osascript
on run argv
  tell application "Terminal"
    activate
    do script "echo " & quoted form of (item 1 of argv) & " " & quoted form of (item 2 of argv)
  end tell
end run

然而,当我运行代码时,它只限于打印前两个参数。

例如,当运行./test.sh foo bar buzz ...时,我希望所有的参数都被显示。

我该如何修改上述代码以支持多个不限数量的参数?并且当我没有指定参数时,它也不会出错?

2个回答

5

默认情况下,AppleScripttext item delimiters{},除非在此之前的脚本中已将其设置为其他值并且没有被重置,并且您没有使用 AppleScripttext item delimiters。如果是这样,那么有一种方法可以避免显式地使用代码,例如 set {TID,text item delimiters} to {text item delimiters,space}set text item delimiters to TID 进行操作。

#!/usr/bin/osascript

on run argv

    set argList to {}
    repeat with arg in argv
        set end of argList to quoted form of arg & space
    end repeat

    tell application "Terminal"
        activate
        do script "echo " & argList as string
    end tell

end run

实际上你也在使用text item delimiters。表达式argList as string将列表连接成一个字符串,考虑了当前的text item delimiters。如果它们没有设置为默认的空字符串列表,那么就会出现意外的行为。 - vadian
1
@vadian,我已经重新措辞了我的答案。此外,我有很多脚本,我从未明确使用AppleScript的 text item delimiters,但是使用了一个我构建的带有空格的列表,然后展平该列表。在我看来,这是处理这种情况的更简单的编码方式,也是我提供它的原因。 - user3439894

3

您需要向映射参数列表中添加一个repeat循环,以将它们的引用形式映射,并使用text item delimiters将列表加入到以空格分隔的字符串中。

#!/usr/bin/osascript
on run argv
    set argList to {}
    repeat with arg in argv
        set end of argList to quoted form of arg
    end repeat
    set {TID, text item delimiters} to {text item delimiters, space}
    set argList to argList as text
    set text item delimiters to TID

    tell application "Terminal"
        activate
        do script "echo " & argList
    end tell
end run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接