如何将多个变量从 AppleScript 显示对话框传递到 bash

How to pass multiple variables from AppleScript display dialog to bash

我 运行 遇到在 AppleScript 和 bash 之间传递多个变量的问题。

我可以用这样的方法得到一个变量

updatedName="$(osascript -e 'set the answer to text returned of (display dialog "What is your name" with title "Question" default answer buttons {"Cancel", "Save"} default button "Save")' return answer)"

如何获得文本的答案以及选择了哪个按钮? 我基本上想在选择取消按钮时退出整个脚本,但我似乎无法同时输入文本和按下哪个按钮。

我试过类似的操作,但取消按钮 returns“26:246:执行错误:用户已取消。(-128)”不是 if 语句的退出 0。

question="$(osascript -e 'set theResultReturned to (display dialog "Enter your nane" with title "Question" default answer "" buttons {"Cancel", "Rename"} default button "Rename")' return answer)
set theTextReturned to the text returned of theResultReturned
set theButtonReturned to the button returned of theResultReturned
if theButtonReturned is "Cancel" then
    exit 0
end if" || exit

我也试过在问题脚本后添加一个额外的 if 语句,但我也无法让它工作。

if [ "$question" = "theButtonReturned:Cancel" ];
then
    exit 0
fi

如果我打印 $question,我会得到

的完整输出
button returned:Rename, text returned:Test
set theTextReturned to the text returned of theResultReturned
set theButtonReturned to the button returned of theResultReturned
if theButtonReturned is Cancel then
    exit 0
end if

它给我返回的文本和按钮输出,但随后它也打印出整个 osascript。

我确定我漏掉了一些简单的东西。我查看了所有 google 和堆栈溢出,但所有示例仅针对一个变量。

你说:

"I basically want to exit the entire script when the cancel button is selected but I can't seem to get both the text entered and which button was pressed."

首先,在用户单击 “取消” 按钮的情况下,不可能 return 同时显示输入的文本和按下的按钮。这仅仅是因为在取消对话框时 AppleScript 会产生您提到的 -128 错误。

考虑采用不同的方法,改为使用以下 shell 脚本。如果用户选择 “取消” 按钮,它会提前退出 bash 脚本,退出代码为 1。但是,当单击 “确定” 按钮时,输入的任何文本(即用户名)都会分配给 username 变量。

#!/usr/bin/env bash

if ! username=$(osascript 2> /dev/null <<-EOF
  return text returned of (display dialog "Enter your name" with title ¬
    "Question" default answer "" buttons {"Cancel", "Rename"} default button "Rename")
EOF
); then
  exit 1
fi

# Continue to do something with $username...
echo "$username"

说明

  • $(...) 部分(command substitution) is utilized to assign the result from the osascript 命令到 username 变量。

  • 2> /dev/null 部分将 stderr 重定向到 /dev/null。当用户单击 “取消” 按钮时,这实质上阻止了 AppleScript -128 错误消息被打印到控制台。

  • <<-EOF 部分(Here document)用于将 AppleScript 代码传递给 osascript 命令。在将多行代码(在本例中为 AppleScript)传递给 shell.

    时,使用 Here 文档特别有用
  • 条件 if 语句以撇号开头(! 表达式),如果表达式为假,则表示为真。本质上,在这种情况下,它意味着如果 osascript 命令的结果为假(即用户单击了 “取消”),则执行 exit 1 语句。

补充说明:

上述示例代码在 macOS Monterey (12.2.1) 上成功运行,但是在 OSX 上的某些旧版本上,您可能需要包含一个 AppleScript“系统事件”tell 块和 activate 语句。当我在一台旧机器上测试脚本(上面)时 运行 OSX (10.6.8) 如果没有它们,对话框不会出现。例如,您可能需要执行以下在 OSX (10.6.8):

上成功运行的操作
#!/usr/bin/env bash

if ! username=$(osascript 2> /dev/null <<-EOF
tell application "System Events"
  activate
  return text returned of (display dialog "Enter your name" with title ¬
    "Question" default answer "" buttons {"Cancel", "Rename"} default button "Rename")
end tell
EOF
); then
  exit 1
fi

# Continue to do something with $username...
echo "$username"