接受可选参数的Shell脚本[重复]

Posted

技术标签:

【中文标题】接受可选参数的Shell脚本[重复]【英文标题】:Shell script to accept optional parameters [duplicate] 【发布时间】:2015-11-26 05:40:25 【问题描述】:

如何在我的 shell 脚本中使用可选参数。

命令行参数为:./abc.sh parm1 parm2 parm3 parm4

这里 parm3 和 parm4 是可选的,具体取决于 parm1(config)

如何编写一个shell脚本,它将强制parm1和parm2作为参数,并将其他两个作为可选参数

【问题讨论】:

我是 shell 新手,第一次处理这种情况。 不要忘记拒绝./abc.sh p1 p2 p3 p4 p5,如果如您的问题所示,只有 2、3 或 4 个参数是可以接受的。你应该知道$#,它是一个特殊的参数(变量),它报告了“命令行参数”(正式术语中的“位置参数”)的数量。 不,这不是重复的,因为这个问题的核心是关于强制参数(尽管有标题),而另一个是关于可选参数。 【参考方案1】:

对所需参数使用$var? 语法:

#!/bin/sh

: $1:?first argument is required
: $2:?second argument is required

您可以使用$# 查看参数的数量,因此您可以执行以下操作:

#!/bin/sh
die()  echo "$@" >&2; exit 1; 
case $1? in
foo) test $# = 4 || die When first argument is foo, you must give 4 args;;
bar) test $# = 2 || die When first argument is bar, only give 2 args;;
*) ;;
esac

【讨论】:

如果将空字符串作为参数传递,test -n "$3" 将通过,因此检查 $# 是处理可能为空的可选值的唯一方法。 您选择不引用这些论点有什么原因吗?也就是说,正如您所指出的那样,这是不好的一般做法,并无助于澄清这里的任何事情。 我会使用: $1?first arg is required 仅当参数完全丢失时才显示错误。如果不允许空字符串作为参数的值,请使用 : $1:?... @chepner: test -n "$3" 在 $3 是空字符串时失败,我默认空字符串在整个过程中是不可接受的。 @Etan 我认为没有引号的代码更简洁,并且在必要时我会小心翼翼地使用它们。唯一的影响是与 echo 的可能差异,这些语句本质上是调试的,不会真正影响任何东西。我相信过度引用和引用不足一样是一个问题,并且导致无法了解何时需要引用以及如何使用它们,所以我在这个论坛的答案中错误地引用不足。现在,带有未引用参数的回声已被删除,所以这一点没有实际意义!

以上是关于接受可选参数的Shell脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

存储可选管道多行字符串和可选参数的批处理脚本

为 PERL 脚本构建 CLI 参数的 Shell 脚本

Powershell 非位置,可选参数

在bash中使用getopts来获取可选的输入参数[重复]

使 URL 接受参数作为可选参数。非捕获

如何让 argparse 识别跟随可变长度可选参数的位置参数?