一行包含多个参数的 Bash 菜单

一行包含多个参数的 Bash 菜单

我已经搜索了几天,仍然没有找到答案。我希望你能为我指明正确的方向。

我想知道如何编写一个带有选项的bash脚本,可以在一行中调用,例如:script.sh -a -b -c。未选择的参数将被忽略。

菜单/选项应该是这样的:

-a description: something
-b description: something else
-c description: something different
-d description: something..

有什么办法可以做到这一点吗?

答案1

处理开关和参数的常用方法是使用getopts函数。这bash是一个内置函数,您可以在 bash 手册页 ( man bash) 中找到有关它的信息。

本质上,您声明一个字符串来告诉getopts需要什么参数,以及它们是否应该有参数。它getopts处理成堆的参数(例如-abc相当于-a -b -c)和命令行的解析。在处理结束时,getopts您可以根据需要处理命令行的其余部分。

典型的脚本片段可能看起来像这样

ARG_A= FLAG_B= FLAG_C=
while getopts 'a:bc' OPT    # -a {argument}, -b, -c
do
    case "$OPT" in
        a)    ARG_A="$OPTARG" ;;
        b)    FLAG_B=yes ;;
        c)    FLAG_C=yes ;;
        *)    echo "ERROR: the options are -a {arg}, -b, -c" >&2; exit 1 ;;
    esac
done
shift $(($OPTIND - 1))

echo "Remaining command line: $*"

您可以添加?为命令选项,如果您想要好的使用消息。请记住,在case块中,您需要引用它或在其前面加上反斜杠,以便将其视为文字。

如果您想在没有内置命令的不同 shell 下运行它,或者您想使用长论证例如,--verbose而不是-v只看一下getopt实用程序。这不是内置的,而是为了在更复杂的情况下提供而编写的。

答案2

您不必使用任何特定于 Bash 的功能来执行此操作:

#!/bin/sh
while true
do
    case "$1" in
        -a)  echo Saw -a!  ;;
        -b)  echo Saw -b!  ;;
        -c)  echo Saw -c!  ;;
        -?)  cat <<USAGE
usage: $0 [-a] [-b] [-c] args

    You cannot currently combine options, as with -ac.
USAGE
            exit 1
            ;;
        *)
            echo End of options!
            break;
            ;;
    esac

    shift       # toss current $1; we're done with it now
done

for p in "$@"
do
    echo "Non-option argument: '$p'"
done

与中的代码不同罗艾玛的回答,我的是可移植的shell脚本代码。它可以在任何 Bourne 类型的 Unix shell 上运行,其历史可以追溯到 1980 年左右。

我认为-?处理程序满足了您的“菜单”要求。该<<USAGE构造称为特雷多克

相关内容