3

我需要使用选择循环和案例指令创建一个包含六个选项的选择菜单,但不是菜单选项的回声命令,它们必须显示如下:

1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6

而且不喜欢:

1) opt1 3) opt3 5) opt5
2) opt2 4) opt4 6) opt6

到目前为止,我有这段代码,但问题出在显示器上,它有 5 个选项垂直显示,但有 6 个选项并排显示:

#! /bin/sh
PS3="Enter your choice :"
select choice in "opt1" "opt2" "opt3" "opt4" "opt5" "Exit"; do
case $REPLY in
    1) echo "$choice";;
    2) echo "$choice";;
    3) echo "$choice";;
    4) echo "$choice";;
    5) echo "$choice";;
    6) echo "see you next time";break;;
    *) echo "Wrong choice!";;
esac
done
4

4 回答 4

4

调整 COLUMNS 变量有助于限制菜单中的列数。我通常这样做(在脚本中):

COLUMNS=1
select ...

当我一直想要一列时。

准确地说, COLUMNS=1 意味着您的终端是一个字符宽。然后选择命令别无选择,只能打印一列菜单项。

准确地说,你可以

  1. 找出最长项目的长度 (itemLen)
  2. 找出项目的数量和 10 的 mod 以获得最大位数(numberLen)
  3. COLUMNS=((itemLen + numberLen = 2))

其中“2”是菜单项编号和项目之间的括号和空格。但这不是必需的。

于 2016-02-29T16:23:43.607 回答
3

尝试这样的事情:

menu()
{
    cat <<EOF
  1) opt1
  2) opt2
  3) opt3
  4) opt4
  5) opt5
  6) opt6
  q) quit
EOF

    echo -n "make your choice > <^H^H"
    read -n 1 foo
    echo

    case "$foo" in
        1|opt1) echo "opt1" ;;
        2|opt2) echo "opt2" ;;
        3|opt3) echo "opt3" ;;
        4|opt4) echo "opt4" ;;
        5|opt5) echo "opt5" ;;
        6|opt6) echo "opt6" ;;
        q|quit) echo "bye bye!" ;;
    esac
}

^Hs 代表 ASCII 序列0x08或(退格BS)。

(在 vim 中你可以用CTRL+vthen输入CTRL+h

于 2013-05-25T14:31:35.893 回答
2

我有同样的问题。我不明白selectLINES 和 COLUMNS 究竟是如何使用的(请参阅 bash 手册页中的“Shell 变量”),但是将 COLUMNS 设置为 1(确实是一些小值)对我有帮助。

于 2014-05-27T23:00:45.470 回答
1

如果可用,您可以使用select内置函数:

#!/bin/bash

select o in opt{1..6}; do
    case "${o}" in
        opt[1-6])
            break
            ;;
        *)
            echo "Invalid choice '${REPLY}', please pick one of the above"
            ;;
    esac
done
echo "You picked: ${o}"

示例运行:

$ ./t.sh
1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6
#? 9
Invalid choice '9', please pick one of the above
#? asdf
Invalid choice 'asdf', please pick one of the above
#? 1
You picked: opt1
于 2013-05-25T14:55:13.110 回答