简洁地将BASH命令字符串拆分为参数和标志

简洁地将BASH命令字符串拆分为参数和标志,bash,command-line-arguments,flags,Bash,Command Line Arguments,Flags,我的BASH命令字符串($@)如下所示:cmd-arg1 foo bar--flag1--flag2 标记在args之后,我在args中没有任何尴尬的问题(我正在构建一个供自己使用的内部工具) 如何将-arg1 foo-arg2 bar提取到$args中,以及将-flag1--flag2提取到$flags中?尽管我怀疑这不是最佳方案,但以下方法仍然有效: >echo$x cmd-arg1 foo-bar--flag1--flag2 >flags=“--${x#*--}” >回声$flags -

我的BASH命令字符串(
$@
)如下所示:
cmd-arg1 foo bar--flag1--flag2

标记在args之后,我在args中没有任何尴尬的问题(我正在构建一个供自己使用的内部工具)


如何将
-arg1 foo-arg2 bar
提取到
$args
中,以及将
-flag1--flag2
提取到
$flags
中?

尽管我怀疑这不是最佳方案,但以下方法仍然有效:


>echo$x
cmd-arg1 foo-bar--flag1--flag2
>flags=“--${x#*--}”
>回声$flags
--flag1--flag2
>前_flags=${x%%“$flags”}
>echo$before_标志
cmd-arg1 foo-bar
>设置$before\u标志
>回声1美元
指令
>回声2美元
-arg1
>回声3美元
福
>回声4美元
酒吧
Ref:--如何在bash中进行字符串操作?

Ref:--如何轻松处理脚本中的命令行选项和参数?

看起来您将参数列表视为单个空格分隔的字符串,而不是一系列单独的参数(例如数组)。如果任何参数包含空格和/或文件名通配符,这将导致问题。此外,在常规参数之前使用标志更为正常。除非您100%确定始终会以相同的格式提供选项和标志,否则这不起作用,例如,建议的代码(显然)不适用于
x=“cmd bar--flag2-arg1 foo--flag1”
;也许这是一个荒谬的例子,但没有一些你必须现实处理的可能组合的想法。。。