【问题标题】:Bash menu with column output带有列输出的 Bash 菜单
【发布时间】:2021-03-25 09:49:47
【问题描述】:

我正在开发一个新项目,并使用了我以前使用过的标准 bash 菜单脚本。

我非常确定我可能没有在搜索引擎(Bash 菜单列输出)中使用正确的术语,并且从经验中剥夺了自己的经验,自己去发现它。我希望我能在这件事上得到一些帮助。

我的问题是我可以在哪里制作,以便菜单的输出(很长并且会更长)可以显示在 5 列中,而不是现在出现的长列表。也许是我自己处理菜单的方式?菜单中使用了太多 printf?

main_menu(){
    printf "    Main Menu\n"
    printf "\n"
    printf "    1) Option 1\n"
    printf "    2) Option 2\n"
    printf "    3) Option 3\n"
    printf "    4) Option 4\n"
    printf "    5) Option 5\n"
    printf "    6) Option 6\n"
    printf "    7) Option 7\n"
    printf "    8) Option 8\n"
    printf "    9) Option 9\n"
    printf "    10) Option 10\n"
    printf "    11) Option 11\n"
    printf "    12) Option 12\n"
    printf "    13) Option 13\n"
    printf "    14) Option 14\n"
    printf "    15) Option 15\n"
    printf "    16) Option 16\n"
    printf "    17) Option 17\n"
    printf "    18) Option 18\n"
    printf "    19) Option 19\n"
    printf "    20) Option 20\n"
    printf "    21) Option 21\n"
    printf "    22) Option 22\n"
    printf "    23) Option 23\n"
    printf "    24) Option 24\n"
    printf "\n"
    printf "    x) x to exit\n"
    printf "\n"
    printf "    Your choice: "
    read main

clear
while [[ "$main" != '\n' ]];
    do
    if [[ "$main" = "\n" ]]; then
      exit;
    else
      case $main in
    1) clear;
       opt_1;
        ;;
    2) clear;
       opt_2;
        ;;
    3) clear;
       opt_3;
        ;;
    4) clear;
       opt_2;
        ;;

<SNIP> This to avoid a stupidly long post as we are aware how the script works :P</SNIP>

        ;;
    x) clear;
      exit;
      ;;
      \n) clear;
      exit;
      ;;
    *) clear;
      option_picked "Pick an option from the menu";
      main_menu;
      ;;
      esac
    fi
  done
}
option_picked(){
    message=${@:-"Error: No message passed"}
    printf "${message}\n"
}

<snip> Below here the submenu system with the commands and other stuff to do</snip>

我说的输出是这样的:

    Main Menu

1) Option 1
2) option 2
3) option 3
4) option 4
   snip to keep it short
x) x to exit

Your choice: 

但我正在尝试的是类似于

Main Menu

1) Option 1      2) Option 2      3) option 3    4) option 4    5) Option 5
6) Option 6      7) Option 7      8) option 8    9) option 9    10) Option 10

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    使用pr 可能会做你想做的事。

    #!/usr/bin/env bash
    
    COLUMNS=$(tput cols)
    
    main_menu(){
        printf "    Main Menu\n"
        printf "\n"
      {
        printf "    1) Option 1\n"
        printf "    2) Option 2\n"
        printf "    3) Option 3\n"
        printf "    4) Option 4\n"
        printf "    5) Option 5\n"
        printf "    6) Option 6\n"
        printf "    7) Option 7\n"
        printf "    8) Option 8\n"
        printf "    9) Option 9\n"
        printf "    10) Option 10\n"
        printf "    11) Option 11\n"
        printf "    12) Option 12\n"
        printf "    13) Option 13\n"
        printf "    14) Option 14\n"
        printf "    15) Option 15\n"
        printf "    16) Option 16\n"
        printf "    17) Option 17\n"
        printf "    18) Option 18\n"
        printf "    19) Option 19\n"
        printf "    20) Option 20\n"
        printf "    21) Option 21\n"
        printf "    22) Option 22\n"
        printf "    23) Option 23\n"
        printf "    24) Option 24\n"
        } | pr -t8 -w "$COLUMNS"
        printf "\n"
        printf "    x) x to exit\n"
        printf "    Your choice: "
        read main
    
    clear
    while [[ "$main" != '\n' ]]; do
        if [[ "$main" = "\n" ]]; then
          exit;
        else
          case $main in
        1) clear;
           opt_1;
            ;;
        2) clear;
           opt_2;
            ;;
        3) clear;
           opt_3;
            ;;
        4) clear;
           opt_2;
            ;;
        x) clear;
          exit;
          ;;
          \\n) clear;
          exit;
          ;;
        *) clear;
          option_picked "Pick an option from the menu";
          main_menu;
          ;;
          esac
        fi
      done
    }
    option_picked(){
      message=(${@:-"Error: No message passed"})
        printf '%s\n' "${message[*]}"
    }
    
    main_menu
    

    【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多