Impossible de faire un script shell avec une répétition avec i de 1 à n boucle
-
07-07-2019 - |
Question
Cela fonctionne (imprime, par exemple, & # 8220; 3 arguments & # 8221;):
to run argv
do shell script "echo " & (count argv) & " arguments"
end run
Cela ne fonctionne pas (affiche uniquement & # 8220; Argument 3: trois & # 8221 ;, et non les deux arguments précédents):
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
Dans les deux cas, j'exécute le script à l'aide de osascript
sous Mac OS X 10.5.5. Exemple d'appel:
osascript 'Script that takes arguments.applescript' Test argument three
Je ne redirige pas la sortie, je sais donc que le script ne génère pas d'erreur.
Si j'ajoute une instruction display dialog
au-dessus du script do shell
, une interaction sans utilisateur est autorisée & # 8221; erreur, donc je sais qu'il exécute le corps de la boucle.
Qu'est-ce que je fais mal? En quoi cette boucle empêche-t-elle osprint d’imprimer?
La solution
Essayez ceci pour éviter d'avoir à utiliser le fichier temporaire.
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
Autres conseils
Votre problème ne semble pas être lié à la boucle ni à l'utilisation de argv. Voici un cas de test beaucoup plus simple où seul le dernier
do shell script "echo foo"
delay 2
do shell script "echo bar"
De plus, le léger changement suivant produira les résultats attendus:
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
contiendra quatre lignes, comme suit:
3 arguments
Argument 1: foo
Argument 2: bar
Argument 3: baz
Cette solution de contournement échoue:
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
Même à présent, seule la dernière ligne est renvoyée. Cela peut être lié à la question suivante de TN2065 :
Q: Mon script produira une sortie sur une longue période. Comment lire les résultats au fur et à mesure qu'ils arrivent?
R: Encore une fois, la réponse courte est que vous ne le faites pas - un script shell ne sera renvoyé que lorsque la commande sera terminée. En termes Unix, il ne peut pas être utilisé pour créer un tuyau. Ce que vous pouvez faire, cependant, est de mettre la commande en arrière-plan (voir la question suivante), d’envoyer sa sortie dans un fichier, puis de lire le fichier à mesure qu’il se remplit.
Hélas, je n'ai pas assez de AppleScript-fu pour savoir comment faire lire plusieurs lignes à AppleScript, ce qui, je suppose, fonctionnerait.