1

我创建了一个循环来为新用户执行一些虚拟机设置功能,其中包括添加主机名、IP 地址等。但是,如果我在任何whiptail 窗口中单击“取消”按钮,它只是移动到循环中的下一个whiptail元素。Cancel如果选择了它,我如何设置它以取消循环并返回主菜单窗口?

while true
do

OPTION=$(whiptail --title "Configuration Menu" --menu "Choose an option" 20 78 10 \
"1"     "Show current configuration." \
"2"     "Setup Wizard." \
...
"0"     "EXIT" 3>&1 1>&2 2>&3)

exitstatus=$?

case "$OPTION" in
 ...
 2)
    # Setup hostname
    HOSTNAME=$(whiptail --inputbox "Hostname" 8 78 `hostname` --title "Serial Number" 3>&1 1>&2 2>&3)
    ...
    # IP address configuration
    IP_CONFIG=$(whiptail --title "Network Configuration" --radiolist "Choose a configuration option" 20 78 10 \
        "DHCP" "Use Dynamic Host Protocol" ON \
        "STATIC" "Configure Static IP" OFF 3>&1 1>&2 2>&3)
     ...
 ;;
esac

这是主菜单的样子: 在此处输入图像描述

如果在第一个输入框中单击“取消”... 在此处输入图像描述

我被发送到下一个whiptail 元素,而不是取消到主菜单: 在此处输入图像描述

4

2 回答 2

1

好的,想通了。我必须将每个案例选项包装在它自己的exitstatus = 0测试中:

2)
      # Setup serial number
      SERIAL=$(whiptail --inputbox "Serial Number" 8 78 `hostname` --title "Serial Number" 3>&1 1>&2 2>&3)
      exitstatus=$?
      if [ $exitstatus = 0 ]; then
         ...
      else
         break
      fi
      ;;
...
于 2016-08-10T17:12:51.463 回答
0

使用breakwhich 退出循环。whiptail在选择时返回 1 <Cancel>,所以测试一下,break如果是这样:

OPTION=$(whiptail --title "Configuration Menu" --menu "Choose an option" 20 78 10 \
"1"     "Show current configuration." \
"2"     "Setup Wizard." \
...
"0"     "EXIT" 3>&1 1>&2 2>&3)

exitstatus=$?

[[ "$exitstatus" = 1 ]] && break;
于 2016-08-10T15:22:39.763 回答