Не могу сделать сценарий оболочки с повторением с циклом от 1 до n

StackOverflow https://stackoverflow.com/questions/274469

Вопрос

Это работает (печатает, например, & # 8220; 3 аргумента & # 8221;):

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

Это не так (только для печати & # 8220; аргумент 3: три & # 8221; и не два предыдущих аргумента):

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 , он выдаст & # 8220; взаимодействие с пользователем не разрешено & # 8221; ошибка, поэтому я знаю, что выполняется тело цикла.

Что я делаю не так? Что в этом цикле заставляет osascript ничего не печатать?

Это было полезно?

Решение

Попробуйте, чтобы избежать использования временного файла.

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

Другие советы

Похоже, что ваша проблема не связана с циклом или использованием argv. Вот гораздо более простой тестовый случай, когда только последний do shell-скрипт фактически возвращает результат:

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 :

  

В: Мой сценарий будет выводить данные долгое время. Как мне прочитать результаты по мере их поступления?

     

A: Опять же, короткий ответ заключается в том, что вы не & # 8217; t & # 8212; Скрипт do shell не вернется, пока команда не будет выполнена. В терминах Unix его нельзя использовать для создания канала. Однако вы можете поместить команду в фоновый режим (см. Следующий вопрос), отправить ее выходные данные в файл и затем прочитать файл по мере его заполнения.

Увы, у меня недостаточно AppleScript-fu, чтобы знать, как заставить сам AppleScript читать несколько строк, что, я подозреваю, сработало бы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top