使用 git rev-parse 和 --parseopt 访问 shell 脚本中的命名参数

Using git rev-parse with --parseopt to access named arguments in a shell script

--parseopt 选项与 git rev-parse 一起使用时,它输出一个可以传递给 eval 的字符串,例如

set -- --foo --bar=arg 'test' --

在 运行 通过 eval 此命令后,它将 $1 设置为“--foo”,将 $2 设置为“--bar=arg”,并将 $3 设置为 "test"。我的问题是,除了设置允许我的脚本按名称访问选项的位置参数之外,set 命令是否有任何魔力?或者我是否必须手动循环参数并自己检查名称?

没有魔法,但您可以将 evaled 的内容更改为其他内容,这样您就可以通过名称访问。例如:

$ eval `git rev-parse --foo --bar=arg | sed -r 's/--//g; /^[^=]+$/s/$/=/'
$ echo $bar
arg
$ [[ ${foo+t} ]] && echo y
y
$ if [[ ${baz+t} ]]; then echo y; else echo n; fi
n

sed 删除前导 --,对于没有 = 的行,在末尾添加 1。当 shell 评估像 foo= 这样的行时,它会将名为 foo 的变量设置为空字符串。您可以测试 foo 是否设置为 [[ ${foo+t} ]]t 是任意的,我选择 t 作为助记符表示 true)。您还可以在 sed 中将变量设置为某个标记值,然后使用简单的 [[ $foo ]] 测试。

根据您需要支持的各种参数,您可能需要调整 sed。使用 set -xv 将向您显示正在发生的一切,以便您进行更改:

$ set -xv
$ eval `git rev-parse --foo --bar=arg | sed -r 's/--//g; /^[^=]+$/s/$/=/'`
eval `git rev-parse --foo --bar=arg | sed -r 's/--//g; /^[^=]+$/s/$/=/'`
git rev-parse --foo --bar=arg | sed -r 's/--//g; /^[^=]+$/s/$/=/'
++ sed -r 's/--//g; /^[^=]+$/s/$/=/'
++ git rev-parse --foo --bar=arg
+ eval foo= bar=arg
foo= bar=arg
++ foo=
++ bar=arg