Как интерпретировать переменные bash в команде applecript
Я пытаюсь написать скрипт bash, который перезагружает заданную вкладку Chrome, и я передаю переменную POSITION_STRING
на applecript, чтобы динамически определять определение утверждения (как я думал, вот для чего используются обозначения heredocs).
Но, похоже, яблочный скрипт отвергает этот тип коннотации, помогите?
declare -A POSSIBLE_POSITIONS
POSSIBLE_POSITIONS=(
["1"]="first"
["2"]="second"
["3"]="third"
["4"]="fourth"
["5"]="fifth"
["6"]="sixth"
["7"]="seventh"
["8"]="eighth"
["9"]="ninth"
["10"]="tenth"
)
# echo "${POSSIBLE_POSITIONS[$1]}"
POSITION=$1
POSITION_STRING=${POSSIBLE_POSITIONS[$POSITION]}
# echo $POSITION_STRING
/usr/bin/osascript <<EOF
log "$POSITION_STRING" # this works!
tell application "Google Chrome"
tell the "$POSITION_STRING" tab of its first window
# reload
end tell
end tell
EOF
3 ответа
Спецификаторы объектов AppleScript прекрасно принимают целочисленные индексы. Там абсолютно нет необходимости использовать
first
,second
и т. д. ключевые слова, и вы вырыли себе дыру, пытаясь втиснуть их в код AppleScript.Когда используешь
osascript
правильный способ передачи аргументов в ваш AppleScript - это поместить их после имени файла (если оно есть).osascript
затем передаст эти аргументы вашему AppleScriptrun
обработчик как список текстовых значений, которые вы можете затем извлечь, проверить, принудительно и т. д. по мере необходимости.
Пример:
POSITION=1
/usr/bin/osascript - "$POSITION" <<'EOF'
on run argv -- argv is a list of text
-- process the arguments
set n to item 1 of argv as integer
-- do your stuff
tell application "Google Chrome"
tell tab n of window 1
reload
end tell
end tell
end run
EOF
Правила цитирования здесь иные, чем в теле скрипта bash. Эта строка в вашем документе здесь:
tell the "$POSITION_STRING" tab of its first window
… Расширяется до (например) этого:
tell the "first" tab of its first window
... что не является синтаксически допустимым. Удалить цитаты вокруг $POSITION_STRING
на этой линии, и это должно работать. Тем не мение:
Как говорит @foo, AppleScript прекрасно понимает числовые индексы; нет необходимости использовать индексы английских слов. использование
tab $POSITION
вместо этого он будет работать с любым числом, а не только с одного до десяти, и ваш сценарий будет короче.Снова повторяя @foo, попытка подстановки переменных в текст скрипта обычно является проигрышной игрой. (Для целых чисел это может сойти с рук, но для строк это становится проблематичным из-за цитирования.) Заставьте ваш скрипт принимать собственные аргументы и затем передавать их
osascript
(1) - страница руководства показывает, как это сделать. Обратите внимание, что аргументы всегда будут представлены в виде строк, поэтому вам нужно будет привести их, если вам нужно число:/usr/bin/osascript - "$POSITION" <<'EOF' on run argv -- argv is a list of text set n to item 1 of argv as integer tell application "Google Chrome" tell tab n of window 1 …
Если ваш bash-скрипт просто поворачивается и вызывает
osascript
(1), вы можете пойти еще дальше:osascript
работает отлично, как интерпретатор Unix, так что вы можете переписать ваш скрипт так:#!/usr/bin/osascript on run argv set n to item 1 of argv as integer tell application "Google Chrome" tell tab n of window 1 …
Сохраните это в файле, пометьте его исполняемым, и Боб станет вашим дядей. (Если вам не нужна функция bash, в этом случае разумным выбором будет документ здесь).
osascript -e
может принимать символы новой строки и переменные. Могут быть причины использовать HEREDOC, но я не знаю о них, и мне кажется, что с этим немного легче работать.
Пример:
TEST='Hello, World!'
osascript -e '
on run argv
display dialog item 1 of argv
end run
' $TEST