2013-06-21 11 views
11

Ich habe ein Shell-Skript, das ich osascript verwendet, und dass osascript ruft ein Shell-Skript und übergibt in einer Variablen, die ich im ursprünglichen Shell-Skript festgelegt haben. Ich weiß nicht, wie ich diese Variable vom AppleScript zum Shell-Skript weiterleiten kann.Übergeben Variable von Shell-Skript zu AppleScript

Wie kann ich eine Variable von Shell-Skript zu AppleScript zu Shell-Skript übergeben ...?

Lassen Sie mich wissen, wenn ich keinen Sinn mache.

i=0 
for line in $(system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'); do 
UDID=${line} 
echo $UDID 
#i=$(($i+1)) 
sleep 1 


osascript -e 'tell application "Terminal" to activate' \ 
-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \ 
-e 'tell application "Terminal" to do script "cd '$current_dir'" in selected tab of the front window' \ 
-e 'tell application "Terminal" to do script "./script.sh ip_address '${#UDID}' &" in selected tab of the front window' 

done 

Antwort

13

Shell-Variablen werden nicht in einfache Anführungszeichen erweitert. Wenn Sie eine Shellvariable an osascript übergeben möchten, müssen Sie doppelte "" Anführungszeichen verwenden. Das Problem ist, als Sie doppelte Anführungszeichen innerhalb des osascript benötigt entkommen müssen, wie:

das Skript

say "Hello" using "Alex" 

Sie Zitate entkommen müssen diese

text="Hello" 
osascript -e "say \"$text\" using \"Alex\"" 

nicht sehr gut lesbar, daher ist es viel besser verwenden, um die heredoc Funktion der bash, wie

text="Hello world" 
osascript <<EOF 
say "$text" using "Alex" 
EOF 

Und Sie c ein Schreib mehrzeiliges Skript in für ein freies, es ist viel besser als mehrere -e args mit ...

+0

Das ist ein schlechter Ratschlag. Abgesehen davon, dass es unnötig schwerfällig ist, reinigt es den eingefügten Text nicht, so dass es weder robust noch sicher ist, z. 'text = 'Bob sagt" hallo "'' wird dazu führen, dass AS einen Syntaxfehler aufgrund von nicht verzahnten Anführungszeichen erzeugt. Benutze niemals Code Munging, wenn eine bessere Lösung existiert, was es tut: wie Lauri Ranta sagte, definiere einen expliziten 'run' Handler und gib deine Strings über ARGV weiter. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/16966117/bash-combining-variables-to-form-a-command-sent-to-applescript-using-the-osascr/16977401#16977401. – foo

+1

@foo Du hast recht, mit 'on run argv' ist" more "korrekt. Meine ist keine _perfect_ Lösung, aber ich benutze es selbst viele Male ohne Probleme, es ist einfach und für viele Skripte verwendbar ... – jm666

+1

Ihre ist eine _buggy_ Lösung. Wenn $ text doppelte Anführungszeichen oder Backslash-Zeichen enthält, wird der AS-Code entweder zu einem Fehler oder - schlimmer - zu einem unbeabsichtigten Verhalten führen. Wenn Sie Code Munging verwenden müssen, müssen Sie Ihre Eingaben bereinigen. z.B. Google "SQL Injection Attack" zu verstehen, warum "es für mich funktioniert" ist _nicht_ eine angemessene Antwort, wenn jemand auf diesen Fehler hinweist. – foo

2

Sie auch einen Run-Handler oder Export verwenden können:

osascript -e 'on run argv 
    item 1 of argv 
end run' aa 

osascript -e 'on run argv 
    item 1 of argv 
end run' -- -aa 

osascript - -aa <<'END' 2> /dev/null 
on run {a} 
    a 
end run 
END 

export v=1 
osascript -e 'system attribute "v"' 

Ich weiß nicht, jede mögliche Weise zu bekomme STDIN. on run {input, arguments} funktioniert nur in Automator.