Bash 脚本中的两个菜单选择

Bash 脚本中的两个菜单选择

我正在学习 Bash,并正在尝试解决一个练习。

该练习包括从菜单列表中选择名字和姓氏。但是,如果该名称不在列表中,则设置手动输入。

但我有点困惑,因为当一个选项被选择时,我不选择如何进入第二个菜单,而没有选择选项“退出”(我尝试在任何选项中添加“中断”,但不起作用)。

对于手动输入,您尝试读取用户的输入,但没有看到任何建议?

当我得到名字和姓氏时,如何终止循环?因为当我同时获得两者时,我会进入同一个循环。

echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

echo "Hello $opt Next Step is Select your Lastname "
done

PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
    case $opt2 in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

clear
echo "Welcome $opt $opt2"
done

答案1

循环select将设置opt为用户选择的选项,并将设置$REPLY为用户键入的内容。因此,如果用户键入1作为对您的第一个问题的回答, $REPLY将是1并且$opt将是Elvis。任何时候都$opt不会Option 1。它使编写case用于测试的语句$REPLY比编写更容易$opt

另外,现在称呼对方的名字还为时过早里面循环select,因为我们可能仍然不确定它们的真实名称。当用户选择一个语句时,语句末尾case和循环结束done之间的代码就会运行select无效的从菜单中选择(您也可以使用*)案例标签来执行此操作)。

最好使用更具描述性的变量名称,例如namefamily,并且我们不需要两个单独的数组来存储选项(事实上,在这种情况下是否需要数组是有问题的,因为我们可以直接列出字符串) 。

在下面的代码中,我还使代码在exit用户选择时终止Quitbreak退出select循环,当用户成功选择名称时我们使用它)。正如常见的那样,所有交互式对话都发生在标准错误流上。

#!/bin/bash

PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your name is not in the list' >&2
            read -e -r -p "What's your name: " name
            break
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
   esac

   echo 'Try again!' >&2

done
printf 'Hello %s, now select your family name\n' "$name" >&2

PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your family is not in the list' >&2
            read -e -r -p "What's your family: " family
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
    esac

    echo 'Try again!' >&2

done

printf 'Welcome, %s %s!\n' "$name" "$family"

其他修复的小问题:使用-rwithread能够正确读取反斜杠,并且在第二个循环中使用PS4而不是PS3设置选择提示。

相关内容