改进菜单

  • 本文关键字:菜单 bash menu
  • 更新时间 :
  • 英文 :


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

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

  1. 每个设备的列表。在此文件中放置标头和 ID 以区分设备是否使用 ssh 或 telnet
  2. 用于完成所有工作的代码。允许进入两种模式:一种是列表中的每个设备都打印一个数字以允许选择任何,另一种模式允许进入搜索模式

我需要你的帮助来实现它,但我接受其他建议。多谢。

假设你有 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一样进行"裸"算术

相关内容

  • 没有找到相关文章

最新更新