接受可选参数的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脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章