【问题标题】:bash select type word not numberbash选择类型单词而不是数字
【发布时间】:2014-03-28 14:15:32
【问题描述】:

我正在使用 bash select 来生成交互式菜单,所以代码如下:

select CHOISE in "${ARRAY_OF_DIRS[@]}"; do
myfolder=$CHOISE
echo "you have selected: $myfolder"
done

将产生这个输出:

1) Desktop
2) Documents
3) Downloads
...

如果您点击“3”之类的内容,脚本会回复:

you have selected: Downloads

我的问题是:有没有办法让脚本接受 ID 号字面答案?所以用户可以输入“下载”而不是“3”?如果您无法使用 select 执行此操作,您对如何重写此脚本以包含此类功能有任何建议吗?

在此先感谢您提供任何帮助:)

【问题讨论】:

  • 如果你有一个名为“2”的文件夹,你想如何区分,所以选择将打印1) "2" 2) "Desktop" - 如果有人输入“2” - 这应该是什么意思 - 一个名为“的文件夹” 2" 还是第二个选项?
  • 好问题!如果 select 有一个保存输入的变量,理论上可以创建一些逻辑来检查这个..?
  • 理论上是可能的 - 但是(恕我直言)你应该消除二元性并只坚持编号选择......
  • 您可以通过单击已解决答案左侧的复选标记将问题标记为已解决。不要在标题中加上“已解决”,这不会在 UI 中将问题标记为已解决。如果没有答案可以解决问题,请添加您自己的答案。您可以检查自己的答案,实际上这样做有一个参与徽章。

标签: bash select interactive


【解决方案1】:

除了$CHOISE之外,您还想查看$REPLY变量:

ARRAY_OF_DIRS=( Desktop Documents Downloads "dir with spaces" )

select CHOISE in "${ARRAY_OF_DIRS[@]}"; do 
    echo "REPLY => $REPLY, CHOISE => $CHOISE"
    myfolder=${CHOISE:-$REPLY}
    echo "you have selected: $myfolder"
done

REPLY 是用户在选择提示符下输入的实际文本。

http://www.gnu.org/software/bash/manual/bashref.html#index-select


您可能需要进行更多验证:

oldIFS=$IFS
IFS=":" 
select CHOISE in "${ARRAY_OF_DIRS[@]}"; do  
    unset myfolder
    if [[ -n $CHOISE ]]; then 
        # user selected a "menu number"
        myfolder=$CHOISE
    elif [[ "$IFS${ARRAY_OF_DIRS[*]}$IFS" == *"$IFS$REPLY$IFS"* ]]; then
        # user typed in a value
        myfolder=$REPLY
    fi
    [[ -n $myfolder ]] &&
        echo "you have selected: $myfolder" ||
        echo "invalid selection: '$REPLY'"
done
IFS=$oldIFS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多