You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bash识别OSA对话框按钮点击状态异常排查

问题分析与解决

问题原因

你的Bash条件判断存在语法错误:在[[ ... ]]结构中,$selection="button returned:Restart Now"是赋值操作,而非字符串比较。赋值语句在Bash中会始终返回true,导致第一个if分支无论用户点击哪个按钮都会触发,所以重启相关代码会一直执行。

解决步骤

修正条件判断的语法,将赋值操作改为比较操作:

  • 比较符号使用==([[ ... ]]推荐的字符串比较符)
  • 比较符号前后必须加空格,避免被解析为字符串拼接或赋值

修正后的代码:

#!/bin/sh

selection=$(osascript -e 'display dialog "A restart is required for this software to install properly..." buttons {"Test", "Restart Later", "Restart Now"} default button "Restart Now"')
echo $selection
if [[ $selection == "button returned:Restart Now" ]]; then
    echo "Would Restart..."
    #sudo shutdown -r now
elif [[ $selection == "button returned:Restart Later" ]]; then
    osascript -e 'display dialog "Software was not installed." buttons {"Ok"} default button "Ok" with icon caution'
else
    echo "Nothing selected!"
fi
exit 0;

优化方案

让osascript直接返回按钮的文本内容,而非完整的button returned:xxx字符串,能让判断逻辑更简洁:

#!/bin/sh

# 直接获取按钮返回的文本
selection=$(osascript -e 'display dialog "A restart is required for this software to install properly..." buttons {"Test", "Restart Later", "Restart Now"} default button "Restart Now"' -e 'return button returned of result')
echo $selection
if [[ $selection == "Restart Now" ]]; then
    echo "Would Restart..."
    #sudo shutdown -r now
elif [[ $selection == "Restart Later" ]]; then
    osascript -e 'display dialog "Software was not installed." buttons {"Ok"} default button "Ok" with icon caution'
else
    echo "Nothing selected!"
fi
exit 0;

另外注意:原代码中$(osascript ...)执行弹窗的写法可以简化为直接写osascript ...,不需要用子shell包裹,因为我们不需要捕获它的输出。

内容的提问来源于stack exchange,提问作者ezogg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:55:09