Shell Bash:如何提示用户从动态填充的列表中选择 select?
Shell Bash: How to prompt a user to select from a dynamically populated list?
这里是新手!
在 Shell 脚本 (bash) 上,在提示用户输入 name/password 后,脚本应该从 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]:
如有任何帮助,我们将不胜感激!
假设这个源文件:
$ 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
循环 才能对 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 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'"
截图
这里是新手!
在 Shell 脚本 (bash) 上,在提示用户输入 name/password 后,脚本应该从 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]:
如有任何帮助,我们将不胜感激!
假设这个源文件:
$ 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
循环 才能对 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 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'"