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

Col*_*old 6 shell options shell-script arguments

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

cut -c2 test.txt
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*zek 6

如果您对最后的可选参数感到满意,您可以这样做:

foo=$1
bar=$2
baz=${3:-default value}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想要开始时的默认值,最简单的方法可能是检查传递给脚本的参数数量,该数量存储在$#. 例如:

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
Run Code Online (Sandbox Code Playgroud)

$#如果您需要错误检查,无论哪种情况,打开都可以正常工作。如果您的脚本使用像cut示例一样的 getopt 样式参数,则可以使用它;有关更多信息,请参阅此堆栈溢出问题