带数组的选项菜单

时间:2016-03-07 03:36:25

标签: bash sh

我正在尝试创建一个脚本来从文件中获取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

1 个答案:

答案 0 :(得分:0)

我假设这是bash,而不是sh。

select命令并不经常使用。您遇到的问题是,您使用$options将整行标记为readarrayselect命令无法为您提供格式化或修剪输出的方法

一种方法是在读取数组后拆分数组:

#!/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