Передать переменную из оболочки script в applescript

У меня есть оболочка script, которую я вызываю, которая использует osascript, и что osascript вызывает оболочку script и передает переменную, которую я установил в исходной оболочке script. Я не знаю, как передать эту переменную из applescript в оболочку script.

Как передать переменную из оболочки script в applescript в оболочку script...?

Сообщите мне, если я не имею смысла.

 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

Ответы

Ответ 1

Переменные оболочки не расширяются внутри одинарных кавычек. Когда вам нужно передать переменную оболочки в osascript, вам нужно использовать двойные кавычки "". Проблема в том, что вы должны избегать двойных кавычек, необходимых внутри osascript, например:

script

say "Hello" using "Alex"

вам нужны кавычки escape

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

Это не очень читаемо, поэтому гораздо лучше использовать функцию bash heredoc, например

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

И вы можете написать многострочный script внутри для свободного, это намного лучше, чем использование нескольких -e args...

Ответ 2

Вы также можете использовать обработчик запуска или экспорт:

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

Я не знаю, как получить STDIN. on run {input, arguments} работает только в Automator.