如何将多个变量从 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"
我 运行 遇到在 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 theosascript
命令到username
变量。2> /dev/null
部分将stderr
重定向到/dev/null
。当用户单击 “取消” 按钮时,这实质上阻止了 AppleScript-128
错误消息被打印到控制台。
时,使用 Here 文档特别有用<<-EOF
部分(Here document)用于将 AppleScript 代码传递给osascript
命令。在将多行代码(在本例中为 AppleScript)传递给 shell.条件
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"