3

这有效(打印,例如,“3 个参数”):

to run argv
    do shell script "echo " & (count argv) & " arguments"
end run

这不会(仅打印“参数 3:三个”,而不是前两个参数):

to run argv
    do shell script "echo " & (count argv) & " arguments"

    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'"
    end repeat
end run

在这两种情况下,我都osascript在 Mac OS X 10.5.5 上运行脚本。示例调用:

osascript 'Script that takes arguments.applescript' Test argument three

我没有重定向输出,所以我知道脚本没有抛出错误。

如果我在display dialog上面添加一个语句do shell script,它会抛出“不允许用户交互”错误,所以我知道它正在执行循环体。

我究竟做错了什么?这个循环导致 osascript 不打印任何东西的原因是什么?

4

2 回答 2

2

尝试这样做以避免必须使用临时文件。

to run argv
        set accumulator to do shell script "echo " & (count argv) & " arguments" altering line endings false
        repeat with i from 1 to (count argv)
                set ln to do shell script "echo 'Argument " & i & ": " & (item i of argv) & "'" altering line endings false
                set accumulator to accumulator & ln
        end repeat
        return accumulator
end run
于 2008-11-08T08:58:28.607 回答
0

就此而言,您的问题似乎与循环或 argv 的使用无关。这是一个更简单的测试用例,其中只有最后一个do shell script实际返回结果:

do shell script "echo foo"
delay 2
do shell script "echo bar"

此外,以下细微的变化将产生预期的结果:

to run argv
    do shell script "echo " & (count argv) & " arguments > /test.txt"
    
    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /test.txt"
    end repeat
end run

test.txt将包含四行,如下所示:

3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz

此解决方法失败:

to run argv
    do shell script "echo " & (count argv) & " arguments > /tmp/foo.txt"
    
    repeat with i from 1 to (count argv)
        do shell script "echo 'Argument " & i & ": " & (item i of argv) & "' >> /tmp/foo.txt"
    end repeat
    
    do shell script "cat /tmp/foo.txt"
    do shell script "rm /tmp/foo.txt"
end run

即使是现在,也只返回最后一行。这可能与TN2065的以下问题有关:

问:我的脚本会在很长一段时间内产生输出。当他们进来时,我如何阅读结果?

答:同样,简短的回答是你不这样做——在命令完成之前,shell 脚本不会返回。在 Unix 术语中,它不能用于创建管道。但是,您可以做的是将命令置于后台(请参阅下一个问题),将其输出发送到文件,然后在文件填满时读取文件。

唉,我没有足够的 AppleScript-fu 知道如何让 AppleScript 本身读取多行,我怀疑这会起作用。

于 2008-11-08T08:35:06.050 回答