2014-03-28 41 views
3

例如bash的选择菜单获得指数

#!/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 

因此,如果用户输入1,case语句检查比赛上的文字,我怎么能匹配1呢?

+0

相关的和非常有用:http://stackoverflow.com/a/226724/1983854 – fedorqui

+0

@fedorqui谢谢,我已经看到了这一点之前,是一个伟大的职位,我想看看我是否能访问按索引 –

+0

bash选择数组我不明白你的问题,如果价值被返回,你怎么知道哪个答案被选中?你通常想要的是价值而不是索引,这是'select'的全部方便。 –

回答

5

你并不需要检查选择了哪个值;你可以简单地使用它。 做的唯一事情想检查的是master,这很容易做到。

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 
+0

没错,就是这样。 –

+0

不,我得到这个,但是他们胖手指,并进入23,这不是一个选项,我该如何处理? –

+1

你没有; 'select'为你处理。如果你输入'23',并且没有选项23,'select'会让你在进入主体之前输入另一个选项。如果*有*选择23,那么,您的代码如何假设区分有意选择和错字? – chepner

4

我很努力地理解你的问题,但这里是一些示例代码;该阵列可以动态填充,我猜你是从哪里来的:

$ cat t.sh 
#!/bin/bash 

foo=(one two three four) 

echo "Please select an option: " 
select reply in "${foo[@]}"; do 
     [ -n "${reply}" ] && break 
done 
echo "You selected: ${reply}" 

$ ./t.sh 
Please select an option: 
1) one 
2) two 
3) three 
4) four 
#? 5 
#? 100 
#? 2 
You selected: two 

这是怎么回事?

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

+0

用更多代码更新了我的问题,这是否会更改您的答案? –

+0

不是,我仍然不明白你为什么要/需要索引。你的值是git标签,你想对这些标签做些什么,选择索引如何相关?正如我演示的那样,如果没有选择答案,select所设置的变量将为空,所以如果输入了无效值或者只是按下回车键,您将继续安装主工作流程。您不需要手动检查'$ result'是否在范围内。 –

+0

表示用户输入30,没有标签,我想输出一条消息,如果用户不想切换标签,我认为通过索引验证我可以更好地控制流量。另外,当我更改为另一个回购时,它可能没有标签和/或标签将以不同的名称命名 –

9

使用$REPLY变量

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 
+1

+1这绝对回答他们的问题,但OP是以一种非惯用的方式做到这一点,所以我建议不要这样做,这是没有必要的。 –

+1

@AdrianFrühwirth老实说,我只有这个问题的标题和最后的情景。 ;)所以,你可能是对的。 ;) – jm666

+0

哈哈,够公平的:-) –