3

最近我试图在这样的 shell 脚本中传递参数:

$./myscript.sh <sourcefile> <destinationfile> -o

脚本应该读入一个源文件和一个目标文件 - 两者都应该是强制性的 - 然后最后检查其他可选参数。但是,当尝试-o使用getopts- 解析选项时,它永远不会找到它。它总是“假”或“0”。-o它仅在选项在其他参数之前传递时才识别!

$./myscript.sh -o <sourcefile> <destinationfile>

这是强制性的,它只能以这种方式工作吗?当我在脚本中搜索规则、约定或实践时,我从来没有找到这些基本信息,只是通过反复试验才发现它,浪费了大量时间……我还想知道复制命令过程是如何工作的,因为它也将可选参数与非可选参数混合

4

1 回答 1

2

传统上,在 unix 中,可选参数排在第一位,至少对于大多数 shell 实用程序而言,这是Posix对编写 shell 实用程序的建议。bash内置getopts也是为此用例设计的;除非您自己重新排序命令行参数,getopts否则只会使用选项参数先出现。

但是,大多数 gnu 实用程序使用 gnugetoptgetopt_longC API,默认情况下,这两种 API 都允许可选参数出现在命令行中的任何位置。即使使用 Posix shell 实用程序,标准也有一些例外。

简而言之:

  • 您应该始终安全地将可选参数放在首位,但在某些情况下,您可以将它们放在最后

  • bash getopts使用内置函数编写的实用程序实际上总是需要先出现可选参数

  • 大多数 Gnu 实用程序允许混合可选参数和位置参数

于 2013-06-25T16:28:02.973 回答