2013-06-21 14 views
11

Ho uno script di shell che chiamo che utilizza osascript e che osascript chiama uno script di shell e passa una variabile che ho impostato nello script di shell originale. Non so come passare quella variabile dal codice di scrittura allo script di shell.Passa da variabile script di shell a applescript

Come posso passare una variabile dallo script di shell a applescript allo script di shell ...?

Fammi sapere se non ho senso.

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 

risposta

13

Le variabili di shell non si espandono all'interno di virgolette singole. Quando vuoi passare una variabile di shell a osascript devi usare le virgolette doppie "". Il problema è, che si deve sfuggire le virgolette necessarie all'interno del osascript, come:

lo script

say "Hello" using "Alex" 

è necessario sfuggire citazioni

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

Questo non molto leggibile, quindi molto meglio utilizzare la funzione della bash heredoc, come

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

E si c uno script multilinea scrittura all'interno per un libero, è molto meglio che usare più -e args ...

+0

Questo è un cattivo consiglio. Oltre a essere inutilmente goffo, non disinfetta il testo inserito, quindi non è né robusto né sicuro, ad es. 'text = 'Bob dice" ciao "'' causerà a AS un errore di sintassi dovuto a virgolette senza escape. Non usare mai il codice munging se esiste una soluzione migliore, cosa che fa: come ha detto Lauri Ranta, definire un gestore 'run' esplicito e passare le stringhe tramite ARGV. Vedi http://stackoverflow.com/questions/16966117/bash-combining-variables-to-form-a-command-sent-to-applescript-using-the-osascr/16977401#16977401 per ulteriori dettagli. – foo

+1

@foo Hai ragione, l'uso di 'on run argv' è" more "corretto. La mia non è una soluzione "perfetta", ma l'ho usata io stesso molte volte senza problemi, è semplice e utilizzabile per molti script ... – jm666

+1

La tua è una soluzione _buggy_. Se $ text contiene virgolette doppie o caratteri di backslash, il codice AS causerà errori o, peggio, comportamenti non previsti. Se è necessario utilizzare il codice munging, è necessario _ disinfettare i propri input. per esempio. Google "SQL injection attack" per capire perché "funziona per me" non è una risposta appropriata quando qualcuno sottolinea questo difetto. – foo

2

È inoltre possibile utilizzare un gestore di marcia o di esportazione:

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"' 

Non conosco alcun modo per ottenere STDIN. on run {input, arguments} funziona solo in Automator.

Problemi correlati