iが1からnのループを繰り返してシェルスクリプトを実行することはできません。

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

質問

これは機能します(たとえば、“ 3つの引数”を印刷します):

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

これはありません(“引数3:3”のみを出力し、前の2つの引数は出力しません):

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

出力をリダイレクトしていないので、スクリプトがエラーをスローしていないことがわかります。

do shell script の上に display dialog ステートメントを追加すると、“ no user Interaction allowed”がスローされます。エラーなので、ループ本体を実行していることがわかります。

間違っているのは何ですか? 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 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 には、次のような4行が含まれます。

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 の次の質問に関連している可能性があります。

  

Q:私のスクリプトは長時間にわたって出力を生成します。入ってくる結果をどうやって読むのですか?

     

A:繰り返しになりますが、簡単な答えは、あなたはそうではありません&t— do shell scriptは、コマンドが完了するまで戻りません。 Unixの用語では、パイプの作成には使用できません。ただし、できることは、コマンドをバックグラウンドに配置し(次の質問を参照)、その出力をファイルに送信し、満杯になったファイルを読み取ることです。

残念ながら、AppleScript自体が複数行を読み取る方法を知るのに十分なAppleScript-fuがありません。これは動作すると思われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top