我在 bash 中遇到了一个小问题。我想做的是:当启动我的树莓派时自动登录并启动一个脚本,我可以在其中选择(像菜单,我使用对话框)启动哪个程序。但是,当 10 秒内没有选择选项时,将执行默认操作(第一个选项)。
嗯,第一部分有效。但我无法包含计时器或超时。超时选项本身只是在 10 秒后终止脚本,但不运行任何程序。
这是我到目前为止所拥有的( echo 用于测试目的):
#!/bin/sh
sw=`dialog --menu "choose a program" 20 73 8 "1) program 1" "this will start program 1" "2) program 2" "this will start program 2" 3>&1 1>&2 2>&3`
case "$sw" in
"1) program 1")
echo "program 1 is running" ;;
"2) program 2")
echo "program 2 is running" ;;
esac
我知道,这并不多。主要是因为我所有的尝试都导致了一个死胡同(据我所知 - 我尝试使用 sleep 命令来构建 while 和 for 循环)。
不幸的是,搜索网络没有帮助(再次:根据我的理解),所以你们有想法(或解决方案)如何解决这个问题吗?我刚刚开始学习 bash。
最佳答案
对话框退出时您需要查看退出代码。 (这将是 $?
的值,但您需要立即获取它,因为它会在每个命令后重置。)
您可能还想自定义返回代码,这可以通过定义一些环境变量来实现。在下面的代码片段中,我将 DIALOG_ERROR
设置为 5,这将适用于超时(和其他随机错误),而我将 DIALOG_ESC
设置为 1,以便它将成为与选择“取消”按钮相同。默认情况下,ESC 和超时实际上返回相同的值(255,即使联机帮助页显示 -1,因为进程退出代码只有 8 位并且通常是无符号的)。如果您希望 Escape 键快速选择默认值,那么您也可以将 DIALOG_ESC
设置为 5。
sw=`DIALOG_ERROR=5 DIALOG_ESC=1 dialog --timeout 10 \
--menu "choose a program" 20 73 8 \
"1) program 1" "this will start program 1" \
"2) program 2" "this will start program 2" \
3>&1 1>&2 2>&3`
rc=$?
case $rc in
0) case "$sw" in
"1) program 1")
echo "program 1 is running" ;;
"2) program 2")
echo "program 2 is running" ;;
esac;;
1) echo You hit Cancel, doing nothing;;
5) echo Running default program;;
*) echo Unhandled exit code $rc;;;
esac
其他退出代码,均不适用于本示例:
- 2 帮助按钮已按下
- 按下了 3 个额外按钮
- 请求 4 项帮助
有关详细信息,请参阅 man 对话框
(搜索DIAGNOSTICS
。已经接近尾声了。)
关于bash - 如何在bash中建立超时后默认操作的菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777206/