2013-06-25 51 views
3

最近我试图来传递参数在这样的shell脚本:Shell:在非可选参数之后是否可以解析可选参数?

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

脚本应该在的资源文件和destinationfile阅读 - 既应该是强制性的 - 然后在最后检查其他可选参数。但是,当试图用getopts解析选项-o时 - 它从未找到它。它总是“假”或“0”。它只在其他参数之前通过时才会识别出选项-o

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

这是强制性的,它只能这样工作吗?当我在规则,惯例或练习脚本中搜索时,我从来没有发现这些重要信息,只有通过试验和错误才能发现它浪费了大量时间......另外我想知道如何执行复制命令过程,因为它也是混合可选参数和非可选参数

+1

您可以在调用getopts之前始终捕获并切换前两个参数。 –

+0

最终有意义。我试图把它们放在前面,但在拨打getopts之前忘了把它们移开。所以它不起作用。谢谢你,我马上试试这个! – Malvin

回答

2

传统上在unix中,至少对于大多数shell实用程序来说,可选参数是第一位的,这是编写shell实用程序的Posix recommendationbash内建的getopts也是为此用例设计的;除非你自己对命令行参数重新排序,否则getopts只能使用选项参数。

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

简而言之:

  • 你应该始终是安全的把可选参数第一,但在某些情况下,你可以把他们在最后

  • utilies书面使用bashgetopts内置实用始终要求可选参数先行

  • 大部分Gnu工具允许混合可选和位置参数