Как интерпретировать переменные 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 ответа

Решение
  1. Спецификаторы объектов AppleScript прекрасно принимают целочисленные индексы. Там абсолютно нет необходимости использовать first, secondи т. д. ключевые слова, и вы вырыли себе дыру, пытаясь втиснуть их в код AppleScript.

  2. Когда используешь osascriptправильный способ передачи аргументов в ваш AppleScript - это поместить их после имени файла (если оно есть). osascript затем передаст эти аргументы вашему AppleScript run обработчик как список текстовых значений, которые вы можете затем извлечь, проверить, принудительно и т. д. по мере необходимости.

Пример:

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 на этой линии, и это должно работать. Тем не мение:

  1. Как говорит @foo, AppleScript прекрасно понимает числовые индексы; нет необходимости использовать индексы английских слов. использование tab $POSITION вместо этого он будет работать с любым числом, а не только с одного до десяти, и ваш сценарий будет короче.

  2. Снова повторяя @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 …
    
  3. Если ваш 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
Другие вопросы по тегам