使用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
相关产品推荐
相关产品推荐

