2013-06-21 7 views
11

osascript을 사용하는 쉘 스크립트가 있는데, osascript은 쉘 스크립트를 호출하고 원래 쉘 스크립트에서 설정 한 변수를 전달합니다. 그 변수를 어떻게 AppleScript에서 쉘 스크립트로 전달할 지 모르겠습니다.쉘 스크립트에서 애플 스크립트로 변수를 전달하십시오.

셸 스크립트에서 셸 스크립트에 대한 AppleScript로 변수를 전달하는 방법은 무엇입니까?

내가 이해가되지 않으면 알려주세요.

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 

답변

13

쉘 변수는 작은 따옴표 안에 확장되지 않습니다. 셸 변수를 osascript으로 전달하려면 "" 따옴표를 사용해야합니다. 그것은 훨씬 더 때문에,

say "Hello" using "Alex" 

당신이 따옴표

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

이 매우 읽을 수 없습니다 벗어날 필요 스크립트 : 문제는 당신이 좋아하는 osascript 내부에 필요한 따옴표를 이스케이프해야합니다보다이며,

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

그리고 당신은 C와 같은, 배쉬의 heredoc 기능을 사용하는 방법 나는 어떤 방법을 모르는

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

: 무료에 대한 내부 쓰기 여러 스크립트, 그것은

+0

이것은 좋은 조언이 아닙니다. 불필요하게 서투른 것 말고는 삽입 된 텍스트를 위생적으로 만들지 않으므로 견고하지도 안전하지도 않습니다. 'text = 'Bob이 "hello"'라고 말하면, AS는 이스케이프되지 않은 따옴표로 인해 구문 오류를 발생시킵니다. Lauri Ranta가 말했듯이, 명시 적으로 'run' 핸들러를 정의하고 문자열을 ARGV를 통해 전달하는 더 좋은 해결책이 존재한다면 절대 코드 분할을 사용하지 마십시오. 자세한 내용은 http://stackoverflow.com/questions/16966117/bash-combining-variables-to-form-a-command-sent-to-applescript-using-the-osascr/16977401#16977401을 참조하십시오. – foo

+1

@foo 당신이 맞습니다.'on run argv'는 "more"가 맞습니다. 내 것은 _ 완벽한 솔루션이 아니지만, 문제없이 여러 번 나 자신을 많이 사용했지만, 간단하고 많은 스크립트에서 사용할 수 있습니다 ... – jm666

+1

당신의 _buggy_ 솔루션입니다. $ text에 큰 따옴표 또는 백 슬래시 문자가 포함되어 있으면 AS 코드가 오류가 발생하거나 의도하지 않은 방식으로 작동합니다. 코드 이동을 사용해야하는 경우 입력 내용을 반드시 소실해야합니다. 예 : 누군가가이 결함을 지적 할 때 "나를 위해 효과가있는"이유가 무엇인지 이해하기위한 Google의 "SQL 주입 공격"은 적절한 대응이 아닙니다. – foo

2

또한 실행 핸들러 또는 내보내기를 사용할 수 있습니다 ... 여러 -e 인수를 사용하는 것보다 훨씬 낫다 STDIN을 얻으십시오. on run {input, arguments}은 Automator에서만 작동합니다.

관련 문제