使用 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
命令是否有任何魔力?或者我是否必须手动循环参数并自己检查名称?
没有魔法,但您可以将 eval
ed 的内容更改为其他内容,这样您就可以通过名称访问。例如:
$ 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
当 --parseopt
选项与 git rev-parse
一起使用时,它输出一个可以传递给 eval
的字符串,例如
set -- --foo --bar=arg 'test' --
在 运行 通过 eval
此命令后,它将 $1 设置为“--foo”,将 $2 设置为“--bar=arg”,并将 $3 设置为 "test"。我的问题是,除了设置允许我的脚本按名称访问选项的位置参数之外,set
命令是否有任何魔力?或者我是否必须手动循环参数并自己检查名称?
没有魔法,但您可以将 eval
ed 的内容更改为其他内容,这样您就可以通过名称访问。例如:
$ 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