最近我尝试像这样在 shell 脚本中传递参数:
$./myscript.sh <sourcefile> <destinationfile> -o
脚本应该读入一个源文件和一个目标文件——两者都应该是强制性的——然后最后检查额外的可选参数。但是,当尝试使用 getopts
解析选项 -o
时 - 它永远找不到它。它始终为“假”或“0”。它只识别在其他参数之前传递的选项 -o
!
$./myscript.sh -o <sourcefile> <destinationfile>
这是强制性的,它只能以这种方式工作吗?当我在脚本中搜索规则、约定或实践时,我从来没有找到这些基本信息,只能通过反复试验来找到它,浪费了很多时间……我也想知道复制命令过程是如何工作的,因为它也混合可选参数和非可选参数
最佳答案
传统上,在 unix 中,可选参数排在第一位,至少对于大多数 shell 实用程序而言,那就是 Posix recommendation用于编写 shell 实用程序。 bash
内置的 getopts
也是为这个用例设计的;除非您自己对命令行参数进行重新排序,否则 getopts
将只对排在前面的选项参数起作用。
但是,大多数 gnu 实用程序使用 gnu getopt
或 getopt_long
C API,默认情况下这两者都允许可选参数出现在命令行的任何位置。即使使用 Posix shell 实用程序,标准也有一些异常(exception)。
简而言之:
您应该始终将可选参数放在最前面,但在某些情况下您可以将它们放在最后
使用内置的
bash
getopts
编写的实用程序实际上总是首先需要可选参数大多数 Gnu 实用程序允许混合可选参数和位置参数
关于bash - 外壳 : Is it possible to parse optional parameters after non-optional ones?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302556/