我正在创建一个 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 个)将始终位于$1
to$3
后处理可选参数的块。