Shell:是否可以在非可选参数之后解析可选参数?

时间:2013-06-25 16:22:42

标签: bash optional-parameters

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

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

脚本应该在源文件和目标文件中读取 - 两者都应该是必需的 - 然后在最后检查其他可选参数。但是,在尝试使用-o解析选项getopts时,它永远找不到它。它总是“假”或“0”。它只能在其他参数传递之前识别选项-o

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

这是强制性的,它只能这样运作吗?当我在网上搜索规则,约定或练习时,我从来没有找到这些基本信息,只能通过试验和错误发现它浪费了很多时间......我也想知道复制命令过程是如何工作的,因为它也是将可选项与非可选参数混合

1 个答案:

答案 0 :(得分:2)

传统上在unix中,可选参数首先出现,至少对于大多数shell实用程序而言,这是用于编写shell实用程序的Posix recommendationbash内置getopts也是针对此用例设计的;除非您自己对命令行参数进行重新排序,否则getopts仅适用于首先出现的选项参数。

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

简而言之:

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

  • 使用内置bash getopts编写的实用程序几乎总是需要可选参数

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