首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux - case命令

问Linux - case命令
EN

Unix & Linux用户
提问于 2018-12-11 23:57:49
回答 2查看 510关注 0票数 1

如何在菜单列表中有空格或制表符?

代码语言:javascript
复制
    PS3='Please enter your choice: '
    options=("Option 1" "Option 2" "Quit")
    select opt in "${options[@]}"
    do
      case $opt in
         "Option 1")
            echo "Your choise is 1"
            ;;
         "Option 2")
            echo "Your choise is 2"
            ;;
         "Quit")
            break
            ;;
         *) echo "Invalid option;;
      esac
    done

我得到了这个:

代码语言:javascript
复制
[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:

但我喜欢这样的东西:

代码语言:javascript
复制
[user@Server:/home/user] ./test.sh
   1) Option 1
   2) Option 2
   3) Option 3
   4) Quit
Please enter your choice:

想法?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-12-12 08:20:28

select语句在bash中显示菜单,不允许为菜单指定缩进。

只是对代码的注释:通常让case语句在$REPLY上操作比使用所选字符串的变量更容易。它使您不必输入字符串两次。

例如。

代码语言:javascript
复制
select opt in "${options[@]}"
do
  case $REPLY in
     1)
        echo "Your choice is 1"
        ;;
     2)
        echo "Your choice is 2"
        ;;
     3)
        break
        ;;
     *) echo 'Invalid option' >&2
  esac
done

或者,对于这个具体的例子,

代码语言:javascript
复制
select opt in "${options[@]}"
do
  case $REPLY in
     [1-2])
        printf 'Your choice is %s\n' "$REPLY"
        ;;
     3)
        break
        ;;
     *) echo 'Invalid option' >&2
  esac
done
票数 1
EN

Unix & Linux用户

发布于 2018-12-12 22:29:32

手动重新实现select并微调显示并不太困难,至少只要您没有那么多选项需要多列列表。

代码语言:javascript
复制
#!/bin/bash

# print the prompt from $1, and a menu of the other arguments
choose() {
    local prompt=$1
    shift
    local i=0
    for opt in "$@"; do
        # we have to do the numbering manually...
        printf "  %2d) %s\n" "$((i += 1))" "$opt"
    done
    read -p "$prompt: "
}

options=("Foo" "Bar" "Quit")
while choose 'Please enter your choice'  "${options[@]}"; do
    case $REPLY in
    1) echo "you chose 'foo'" ;;
    2) echo "you chose 'bar'";;
    3) echo 'you chose to quit'; break;;
    *) echo 'invalid choice';;
    esac
done

当然,这可以扩展为将数组键(索引)考虑在内,并将它们作为菜单中的选项来表示,而不是运行计数器。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/487506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档