bash选择菜单获取索引

bash选择菜单获取索引,bash,shell,select,Bash,Shell,Select,范例 因此,如果用户输入1,case语句将检查文本上是否匹配,我如何才能匹配1?我很难理解您的问题,但下面是一些示例代码;数组可以动态填充,我想这就是您的来源: #!/bin/bash INSTALL_PATH="/usr/local" BFGMINER_INSTALL_PATH="${INSTALL_PATH}/bfgminer" BFGMINER_REPO="https://github.com/luke-jr/bfgminer.git" list_last_ten_bfgminer_t

范例


因此,如果用户输入1,case语句将检查文本上是否匹配,我如何才能匹配1?

我很难理解您的问题,但下面是一些示例代码;数组可以动态填充,我想这就是您的来源:

#!/bin/bash

INSTALL_PATH="/usr/local"
BFGMINER_INSTALL_PATH="${INSTALL_PATH}/bfgminer"
BFGMINER_REPO="https://github.com/luke-jr/bfgminer.git"

list_last_ten_bfgminer_tags () {
    cd ${BFGMINER_INSTALL_PATH}
    git for-each-ref --format="%(refname)" --sort=-taggerdate --count=10 refs/tags | cut -c 6-
}

clone_bfgminer () {
    cd ${INSTALL_PATH}
    git clone ${BFGMINER_REPO} ${BFGMINER_INSTALL_PATH}
}

echo "select number to switch tag or n to continue"
select result in master $(list_last_ten_bfgminer_tags)
do

    # HOW DO I CHECK THE INDEX???????  <================================= QUESTION
    if [[ ${result} == [0-9] && ${result} < 11 && ${result} > 0 ]]
        then
            echo "switching to tag ${result}"
            cd ${BFGMINER_INSTALL_PATH}
            git checkout ${result}
    else
        echo "continue installing master"
    fi

    break
done

这怎么还不够

当然,如果希望输出/逻辑与select提供的不同,您也可以自己使用read和build功能。

使用$REPLY变量


您不需要检查选择了哪个值;你可以简单地使用它。您唯一要检查的是master,这很简单

PS3="Select what you want>"
select answer in "aaa" "bbb" "ccc" "exit program"
do
case "$REPLY" in
    1) echo "1" ; break;;
    2) echo "2" ; break;;
    3) echo "3" ; break;;
    4) exit ;;
esac
done

相关且非常有用:@fedorqui谢谢,我以前看过这篇文章,这是一篇很棒的帖子,我想看看我是否可以通过indexI访问bash select数组。我不明白你的问题,如果返回值,你怎么知道选择了哪个答案?您通常需要的是值,而不是索引,这是选择的全部便利。请发布一些代码,说明如何填充菜单。如果不知道您遇到的确切问题,就很难提出解决方案。@chepner用我的代码更新了我的问题,用更多的代码更新了我的问题,这会改变您的答案吗?不太可能,我仍然不明白您为什么想要/需要索引。你的值是git标记,你想用这些标记做点什么,选择索引是如何相关的?正如我所演示的,如果未选择任何答案,则select设置的变量将为空,因此,如果输入无效值或只需按enter键,则将继续您的工作流。您不需要手动检查$result是否在范围内。假设用户输入30,没有标记,我想输出一条消息,而且如果用户不想切换标记,我认为通过使用索引验证,我可以更好地控制流。此外,当我更改为另一个回购协议时,它可能没有标签,或者如果使用输入30,标签将被命名为不同,select检测到这是一个无效的选择,并再次提示您。标记的名称是否会有所不同并不重要,因为您只需具体检查主案例,并使用结果即可。+1这肯定回答了他们的问题,但OP从一开始就以一种非常不惯用的方式进行操作,因此我建议不要这样做,“这根本没必要。”阿德里安弗吕霍斯老实说,我只读到了标题和最后一个场景中的问题;所以,你可能是对的;不,我知道,但我知道他们胖手指,进入23,这不是一个选项,我怎么处理这个?你不;选择为您处理它。如果键入23,但没有选项23,“选择”将使您在输入正文之前输入另一个选项。如果有一个选项23,那么,你的代码应该如何区分故意的选择和打字错误呢?也许我遗漏了这一点,我正在测试更改,但如果我选择了菜单上没有的选项,它仍然会结束。或者,我误解了我自己的测试。我马上就搞定答案。特别是,如果您做出了无效的选择,结果将设置为空字符串。阿德里安暗示了这一点,但显然删除了他的评论。谢谢,这样做了,但我确实需要将中断转移到if和else中
$ ./t.sh
Please select an option:
1) one
2) two
3) three
4) four
#? 5
#? 100
#? 2
You selected: two
PS3="Select what you want>"
select answer in "aaa" "bbb" "ccc" "exit program"
do
case "$REPLY" in
    1) echo "1" ; break;;
    2) echo "2" ; break;;
    3) echo "3" ; break;;
    4) exit ;;
esac
done
select result in master $(list_last_ten_bfgminer_tags)
do
    if [[ $result = master ]]; then
        echo "continue installing master"
    elif [[ -z "$result" ]]; then
        continue
    else
        echo "switching to tag ${result}"
        cd ${BFGMINER_INSTALL_PATH}
        git checkout ${result}
    fi
    break
done