从1到n循环不能用i重复执行shell脚本

时间:2008-11-08 06:51:34

标签: shell for-loop applescript repeat osascript

这有效(打印,例如,“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

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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本身读取多行,我怀疑它会起作用。