我用bash编写了一个菜单来访问网络设备,但现在有很多用于在一个屏幕上显示以允许选择一个没有向上或向下滚动的菜单。我需要改进它,附上我的实际菜单。 (https://dl.dropboxusercontent.com/u/33222611/menu.txt)
我一直在考虑的选项是有两个文件:
我需要你的帮助来实现它,但我接受其他建议。非常感谢。
答案 0 :(得分:0)
假设你有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 "%s\n" "${!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 "%s\n" "${hosts[@]}" | sort | pr -t -w $(tput cols) -4 | less -E
done
typeset -i i
使用“整数”属性设置变量i
,因此我们可以像i=i+1
那样进行“裸”算术