Bash case语句:检索有效选项的列表



是否有办法检索case语句中的选项列表?例如,如果我有这样的代码:

tool=$1
case ${tool} in 
     brdf)
        # Do stuff
        ;;
     drift)
        # Do other stuff
        ;;
     *)
        echo "ERROR: I don't know this tool. Valid options are: brdf, drift"
        exit 1
        ;;
esac

这很容易阅读,但是当从列表中添加/删除工具时,错误信息很容易过时,因为我也需要记住更改那里的名称。

可以使用像这样的数组来避免重复:

tool=$1
validtools=(brdf drift)
case ${tool} in
     ${validtools[0]})
           # Do stuff
           ;;
     ${validtools[1]})
           # Do other stuff
           ;;
     *)
           echo "ERROR: I don't know this tool. Valid options are: ${validtools[@]}"
           exit 1
           ;;
esac

但是这读起来很可怕,而且在任何情况下,用硬编码的数组索引来维护会更糟糕。

是否有一种好的方法来做到这一点,也许是一些变量或命令来检索可用选项的列表,或者我只需要记住在添加新选项时更新错误消息?

最常用的方法是作为您的第一个例子。查看linux中的所有初始化脚本

是有原因的,因为你可以使用这样的结构:

case "$a" in
    arg1|arg2|arg3) ... ;;
    brg1|brg2) ... ;; 
    brg2) ... ;;
esac

和难以自动构造具有所有可能变体的正确usage message

这里也是shopt -s extglob,它允许您在case语句中使用扩展模式匹配。示例如下:https://stackoverflow.com/a/4555979/632407

但是如果你想使用数组,试着使用关联数组,这会增加一点可读性。(但无论如何都很糟糕):)就像下一个:

declare -A arg
initargs() { for a in "$@"; do arg[$a]="$a"; done; }
initargs brd lbrs ubrs
for myarg 
do
    case "$myarg" in
        ${arg[brd]}) echo "brd";;
        ${arg[ubrs]}) echo "ubrs";;
        ${arg[lbrs]}) echo "lbrs";;
        *) echo "Unknown arg =$myarg=. Known are: ${arg[@]}" ;;
    esac
done

所以允许的参数是:"brd" "lbrs" "ubrs"以及用于下一个输入的脚本

$ bash argtest ubrs badarg brd

生产:

ubrs
Unknown arg =badarg=. Known are: lbrs ubrs brd
brd

最新更新