改善菜单

时间:2015-05-01 11:03:42

标签: bash menu

我用bash编写了一个菜单来访问网络设备,但现在有很多用于在一个屏幕上显示以允许选择一个没有向上或向下滚动的菜单。我需要改进它,附上我的实际菜单。 (https://dl.dropboxusercontent.com/u/33222611/menu.txt

我一直在考虑的选项是有两个文件:

  1. 每台设备的清单。在此文件中放置标题和ID以区分设备是否使用ssh或telnet
  2. 完成所有工作的代码。允许进入两种模式:一种是列表的每个设备都打印一个数字以允许选择任何一种模式,另一种模式允许进入搜索模式
  3. 我需要你的帮助来实现它,但我接受其他建议。非常感谢。

1 个答案:

答案 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那样进行“裸”算术