可选参数在强制参数之后还是之前?

可选参数在强制参数之后还是之前?

我正在创建一个 shell 脚本,我需要它接受两个强制参数和一个可选参数。我该如何检查?在我见过的大多数脚本中,可选参数在强制参数之前传递,例如:

cut -c2 test.txt

但对我来说,这种模式在脚本中检查起来会很复杂,所以我的想法是将第三个参数视为可选。

答案1

如果您同意最后的可选参数,您可以这样做:

foo=$1
bar=$2
baz=${3:-default value}

这会将前两个参数存储在$foo和中$bar。如果提供了第三个参数,它将存储在$baz;否则将默认为default value.您还可以检查第三个变量是否为空:

if [ -z "$3" ]; then
    # Code for the case that the user didn't pass a third argument
fi

如果您希望一开始就使用默认值,最简单的方法可能是检查传递给脚本的参数数量,这些参数存储在$#.例如:

case $# in
  2)
    # Put commands here for when the user passes two arguments
    # Could just be setting variables like above, or anything else you need
    ;;
  3)
    # Put commands here for when the user passes three arguments
    ;;
  *)
    echo "Wrong number of arguments passed"
    exit 1;;
esac

如果您想要进行错误检查,则无论哪种情况,打开$#都可以正常工作。如果您的脚本使用像示例一样的 getopt 样式参数cut,您可以使用它;看这个堆栈溢出问题了解更多信息

答案2

有两个不同的概念:强制参数与可选参数,以及选项与操作数。选项是以 开头的参数-,操作数是不以 开头的参数-,并且不是选项的参数。选项通过其名称进行标识,并且通常可以按任意顺序排列。操作数通过其位置来标识。所以在

someprogram -a -z -c foo bar

有三个选项-a-c-z,并且有两个操作数,第一个是foo,第二个是bar

选项通常位于操作数之前。 GNU 程序往往不关心顺序,而大多数非 GNU 程序会将以 开头的参数视为-操作数(如果它们前面有另一个操作数)。选项(分组等)有很多变化--,我不会在这里讨论。

如果您的程序采用两个强制操作数和第三个可选操作数,那么自然的方式是强制操作数为第一个和第二个,第三个操作数为可选操作数(如果存在)。

在 shell 脚本中,参数为"$1""$2""$3"等。参数数量为$#。如果您的脚本无法识别任何选项,您可以省略选项检测并将所有参数视为操作数。看迈克尔·莫罗泽克的回答示例代码。如果您确实想识别选项,请使用getopts内置选项(有关示例,请参阅 shell 的文档)。

答案3

将可选参数放在开头的一种方法是使用shift.
它的作用是将所有参数向左移动 n 步,删除下面的参数$1。如果 没有给出任何参数shift,则步数为 1。

在脚本的开头,您检查第一个参数是否与可选参数或第一个必需参数的结构匹配。
如果这是必需的,那么您什么也不做。
如果它是可选的,您可以处理它并调用shift.

这里有用的是,无论是否给出可选参数,必需的参数(假设有 3 个)将始终位于$1to$3 处理可选参数的块。

相关内容