Shell Bash:如何提示用户从动态填充的列表中进行选择?

问题描述 投票:0回答:3

这里是新人!

在 Shell 脚本 (bash) 上,提示用户输入名称/密码后,脚本应从 server.list 读取并生成选项以供选择。

如何向用户提供 server.list 中的选项,如下所示:

#Please select from the server list:  

1) 10.1.1.xx

2) 10.1.1.xx

3) 10.1.1.xx

Select option [1]:  

如有任何帮助,我们将不胜感激!

bash shell sh
3个回答
7
投票

假设这个文件:

$ cat server.list 
10.1.1.xx
10.1.2.xx
10.1.3.xx

简短回答:

select ip in $(cat server.list); do 
   echo $REPLY $ip
done

演示

$ select ip in $(cat server.list); do echo $REPLY $ip; done
1) 10.1.1.xx
2) 10.1.2.xx
3) 10.1.3.xx
#? 1
1 10.1.1.xx
#? 2
2 10.1.2.xx

您必须实现一个

case
loop 才能使用
ip
变量做一些有用的事情。

示例

select ip in $(cat server.list) exit; do 
   case $ip in
      exit) echo "exiting"
            break ;;
         *) echo ip $ip;
   esac
done

6
投票

由于答案已经涵盖了如何使用 Bash 的

select
来完成此操作,这里还有另外两个选项。

1.普通 POSIX shell

以下是如何在不依赖 Bash 扩展的情况下,在 POSIX shell 脚本中向用户提供从选项列表中选择一个选项的方法。

代码

#!/bin/sh
echo 'Please select from the server list:'
nl server.list
count="$(wc -l server.list | cut -f 1 -d' ')"
n=""
while true; do
    read -p 'Select option: ' n
    # If $n is an integer between one and $count...
    if [ "$n" -eq "$n" ] && [ "$n" -gt 0 ] && [ "$n" -le "$count" ]; then
        break
    fi
done
value="$(sed -n "${n}p" server.list)"
echo "The user selected option number $n: '$value'"

交互示例

Please select from the server list:
     1  10.1.1.1
     2  10.1.1.2
     3  10.1.1.3
     4  10.1.1.4
     5  10.1.1.5
Select option: 0
Select option: -1
Select option: w
list.sh: line 9: [: w: integer expression expected
Select option: 3
The user selected option number 3: '10.1.1.3'

2.使用对话框(1)

如果您在用户的计算机上安装了

dialog(1)
,您可以向用户呈现伪图形菜单。

代码

#!/bin/sh
tempfile="$(mktemp)"
while true; do
    dialog --menu 'Please select from the server list' 18 70 15 $(nl server.list) 2>"$tempfile" && break
done
n="$(cat "$tempfile")"
value="$(sed -n "${n}p" server.list)"
rm "$tempfile"
echo "The user selected option number $n: '$value'"

截图


0
投票

或者基于@nwk的答案,但使用for循环并从另一个命令获取输出(其中

get_server_ips
是返回IP列表的命令):

echo 'Please select from the IP list:'
ips=$(get_server_ips)
echo -e "$ips" | nl;
count="$(echo -e "$ips" | wc -l)"
read -p 'Select option: ' n
for i in `echo -e "$ips" | nl`;
do
    if [ "$n" == "$i" ]; then
        value=$(echo -e "$ips" | sed -n ${i}p) 2>&1
        break
    fi
done;
echo "The user selected option number $n: '$value'"
© www.soinside.com 2019 - 2024. All rights reserved.