我在bash中编写了一个菜单来访问网络设备,但现在有很多菜单显示在一个屏幕中,以允许在不向上或向下滚动的情况下选择一个。我需要改进它,附上我的实际菜单。(https://dl.dropboxusercontent.com/u/33222611/menu.txt)
我一直在考虑的选项是有两个文件:
- 每个设备的列表。在此文件中放置标头和 ID 以区分设备是否使用 ssh 或 telnet
- 用于完成所有工作的代码。允许进入两种模式:一种是列表中的每个设备都打印一个数字以允许选择任何,另一种模式允许进入搜索模式
我需要你的帮助来实现它,但我接受其他建议。多谢。
假设你有 bash 版本 4,这是关联数组的一个很好的例子:
declare -A cmd=(
[ESP_R7609S_MTSO]=ssh
[ESP_R7609_RIGUERO]=ssh
[ESP_R7609_SUBASTA]=telnet
[ESP_R7606_BOLONIA]=ssh
[ESP_R7609_LINDAVISTA]=ssh
# etc etc
)
while :; do
read -p "Enter a hostname: " hostname
if [[ ${cmd[$hostname]} ]]; then
"${cmd[$hostname]}" "$hostname"
break
else
echo "unknown hostname. The known hosts are:"
printf "%sn" "${!cmd[@]}" | sort | paste - - - - - | column -t | less -E
fi
done
旧 bash:使用"并行"索引数组
typeset -a hosts cmds
typeset -i i=0
hosts[i]=ESP_R7609S_MTSO; cmds[i]=ssh; i=i+1
hosts[i]=ESP_R7609_RIGUERO; cmds[i]=ssh; i=i+1
hosts[i]=ESP_R7609_SUBASTA; cmds[i]=telnet; i=i+1
hosts[i]=ESP_R7606_BOLONIA; cmds[i]=ssh; i=i+1
hosts[i]=ESP_R7609_LINDAVISTA; cmds[i]=ssh; i=i+1
# ...
while :; do
read -p "Enter a hostname: " hostname
i=0
while [[ $i -lt ${#hosts[@]} ]]; do
if [[ $hostname == ${hosts[i]} ]]; then
"${cmds[i]}" "$hostname"
break 2
fi
i=i+1
done
echo "unknown hostname. The known hosts are:"
printf "%sn" "${hosts[@]}" | sort | pr -t -w $(tput cols) -4 | less -E
done
typeset -i i
使用"integer"属性设置变量i
,因此我们可以像i=i+1
一样进行"裸"算术