Не могу сделать сценарий оболочки с повторением с циклом от 1 до n
-
07-07-2019 - |
Вопрос
Это работает (печатает, например, & # 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 читать несколько строк, что, я подозреваю, сработало бы.