bash - 外壳 : Is it possible to parse optional parameters after non-optional ones?

标签 bash optional-parameters

最近我尝试像这样在 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 getoptgetopt_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/

相关文章:

linux - 在 bash 中将一个文件 append 到另一个文件的中间

python - 在 python 中连接 Bash 命令

linux - 管理每周备份

c# - 函数重载与可选参数

c# - 传递给 WCF 服务的可选查询字符串参数

c# - 多个可选参数调用函数

bash - 在 awk 字符串中调用 'date' 命令,格式为 +%a

bash - 在 bash shell 脚本中从 glob 目录内的命令行执行命令

python - 如何使用可选参数调用python函数

api - 如何使用 reitit clojure 定义可选查询参数