最近我试图在shell脚本中传递参数:
$./myscript.sh <sourcefile> <destinationfile> -o
脚本应该在源文件和目标文件中读取 - 两者都应该是必需的 - 然后在最后检查其他可选参数。但是,在尝试使用-o
解析选项getopts
时,它永远找不到它。它总是“假”或“0”。它只能在其他参数传递之前识别选项-o
!
$./myscript.sh -o <sourcefile> <destinationfile>
这是强制性的,它只能这样运作吗?当我在网上搜索规则,约定或练习时,我从来没有找到这些基本信息,只能通过试验和错误发现它浪费了很多时间......我也想知道复制命令过程是如何工作的,因为它也是将可选项与非可选参数混合
答案 0 :(得分:2)
传统上在unix中,可选参数首先出现,至少对于大多数shell实用程序而言,这是用于编写shell实用程序的Posix recommendation。 bash
内置getopts
也是针对此用例设计的;除非您自己对命令行参数进行重新排序,否则getopts
仅适用于首先出现的选项参数。
但是,大多数gnu实用程序使用gnu getopt
或getopt_long
C API,默认情况下这两个API都允许可选参数出现在命令行的任何位置。即使使用Posix shell实用程序,标准也有一些例外。
简而言之:
您应该始终安全地放置可选参数,但在某些情况下,您可以将它们放在最后
使用内置bash
getopts
编写的实用程序几乎总是需要可选参数
大多数Gnu实用程序允许混合可选和位置参数