根据变量创建包含 x 项的菜单

根据变量创建包含 x 项的菜单

我正在尝试根据变量获取包含 x 行的菜单。

设置:

我有一个有 x 个 IP 地址的网络

我希望用户获得一个菜单,他可以在其中输入数字来简单地选择 IP 地址:

例如:

我有4个IP地址

ip1=192.168.1.1
ip2=192.168.1.2
ip3=192.168.1.3
ip4=192.168.1.4

我希望用户得到一个像这样的菜单

1. 192.168.1.1
2. 192.168.1.2
3. 192.168.1.3
4. 192.168.1.4
Please enter your choice:

但是,IP 地址的数量可能会有所不同。

我正在尝试在一个案例中这样做:

echo -n "Please enter your choice: "
read opt
case $opt in
    ipnum=ip$opt

    1)  echo ${!ipnum}
esac

但我无法让它进入循环

答案1

如果您正在使用bash(或类似的 shell):

ipnums=( 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 )

select ip in "${ipnums[@]}"; do
    case $ip in
        "") echo 'Invalid choice' >&2 ;;
        *)  break
    esac
done

printf 'You picked IP %s\n' "$ip"

这将显示一个菜单和一个提示,如下所示:

1) 192.168.1.1
2) 192.168.1.2
3) 192.168.1.3
4) 192.168.1.4
#? 

PS3可以通过设置要使用的提示字符串来更改提示。

select循环验证输入并循环,直到从用户处获得有效输入。

循环结束后,所选的 IP 地址将在 中可用$ip

如果您不想将地址存储在数组中,则必须列出相关变量(这不容易推广到 N 个变量,这就是为什么我建议在我的回答中使用数组你的另一个问题):

select ip in "$ip1" "$ip2" "$ip3" "$ip4"; do ...; done

答案2

就我而言,我想通了。

就像 @fra-san 所说的为什么要使用案例而不只是打印它并询问用户选择。

我只是使用一个数组来回显所有 IP 寻址,并在前面添加一个额外的数字,当他们输入数字时,它与变量中的数字相对应,所以我有了我的答案。

相关内容