我正在尝试根据变量获取包含 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 寻址,并在前面添加一个额外的数字,当他们输入数字时,它与变量中的数字相对应,所以我有了我的答案。