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

Shell Bash:如何提示用户从动态填充的列表中进行选择?,bash,shell,sh,Bash,Shell,Sh,这里是新手 在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]: 任何帮助都将不胜感激 假设此源文件: 简短答复: select ip in $(cat server.list

这里是新手

在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]:  
任何帮助都将不胜感激

假设此源文件:

简短答复:

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
循环,以便对
ip
变量执行一些有用的操作

示例

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

因为答案已经包括了如何使用Bash的
select
实现这一点,这里还有两个其他选项

1.平POSIX壳 下面是如何实现在不依赖Bash扩展的情况下,向用户展示posixshell脚本中选项列表中的一个选项选项

代码 样本交互 2.使用对话框(1) 如果已在用户机器上安装,则可以向用户显示伪图形菜单

代码 截图

用户计算机上是否安装了
对话框
select ip in $(cat server.list) exit; do 
   case $ip in
      exit) echo "exiting"
            break ;;
         *) echo ip $ip;
   esac
done
#!/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'
#!/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'"