我正在尝试创建一个脚本来从文件中获取ip列表并使用select选项在屏幕上显示它,并通过选择使ssh成为该IP。文件如下;
name1 1.1.1.1
name2 2.2.2.2
name3 3.3.3.3
name4 4.4.4.4
下面的脚本可以从文件中读取列表并在屏幕上显示为菜单。它显示了名称和IP供选择,但我想按名称显示选择菜单。我怎样才能做到这一点?
PS3='Please enter your choice: '
readarray -t options < ./file.txt
select opt in "${options[@]}"
do
IFS=' ' read name ip <<< $opt
case $opt in
$opt) ssh $ip;;
esac
done
1) name1 1.1.1.1
2) name2 2.2.2.2
3) name3 3.3.3.3
4) name4 4.4.4.4
Please enter your choice: 1
答案 0 :(得分:0)
我假设这是bash,而不是sh。
select
命令并不经常使用。您遇到的问题是,您使用$options
将整行标记为readarray
,select
命令无法为您提供格式化或修剪输出的方法
一种方法是在读取数组后拆分数组:
#!/usr/bin/env bash
declare -a opt_host=() # Initialize our arrays, to make sure they're empty.
declare -A opt_ip=() # Note that associative arrays require Bash version 4.
readarray -t options < ./file.txt
for i in "${!options[@]}"; do
opt_host[$i]="${options[$i]%% *}" # create an array of just names
opt_ip[${opt_host[$i]}]="${options[$i]#* }" # map names to IPs
done
PS3='Please enter your choice (q to quit): '
select host in "${opt_host[@]}"; do
case "$host" in
"") break ;; # This is a fake; any invalid entry makes $host=="", not just "q".
*) ssh "${opt_ip[$host]}" ;;
esac
done