我有一个像这样上课的脚本gitploy up -t 2.0.0 test_repo
。我立即拉出“操作” up
,然后我需要能够test_repo
在处理选项之前获得“操作”。我不想失去这些论点,如果这是有道理的..不想把它移开,只是得到它并让它成为现实?基本上我想test_repo
在这之前获得那个位置
while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
case $opt in
#flag----------------------
h)
usage;
exit 0
;;
#callback------------------
c) queue_callback "$OPTARG"
shift $((OPTIND-1)); OPTIND=1
;;
### so one and so forth
脚本部分。所以基本上我可以做这样的事情
# i would get the first argument after the options here first so "test_repo"
# would be a $@ or $* or something?
root_arg="test_repo"
while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
case $opt in
#flag----------------------
h)
usage;
exit 0
;;
#callback------------------
c) queue_callback "$OPTARG"
echo "$root_arg was here"
shift $((OPTIND-1)); OPTIND=1
;;
### so one and so forth
在更广泛的范围内,我猜测的问题可能是,“如何通过相对于选项的位置获取参数?”
问题的修改:
希望能说这样的话,
- getopts 输出在 var 命令中的位置
- 调用getopts输出的位置+1
test_repo
参数位于 getopts 输出之后 +1
- 进行正常处理
出于向后兼容性的原因,我试图不移动该命令,但并不仅限于此。我想我可以在这里写一点垫片,因为我知道模式已经设置为gitploy <__action> [__options] <__alias> [__remote_url]
.
我想我可以让一切都成为一种选择,并弃用其他论点。不确定这是一个不好的方法,但似乎我必须按顺序扫描以查找<__alias>
(或test_repo
示例中所示的)并将其作为诸如 之类的选项查找-a test_repo
。
即使这最终不是正确的方法,我也想知道您是否可以在此处“读取光标”并确定参数值,或者是否这是不可能的事情。
下面的答案的结果
while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
case "$opt" in
esac
done
index="$((OPTIND))"
GD_REPO="${!index}";
OPTIND=1
这就是我最终所做的。快进然后快退似乎是肮脏的伎俩,但它确实有效。如果有更好的想法,我仍然很乐意学习。
答案1
你的要求在逻辑上是矛盾的。给定像 之类的输入gitploy up -t 2.0.0 test_repo
,您需要解析选项,特别是注意-t
选项的存在以及它需要一个参数的事实,以便识别第一个非选项参数是test_repo
。
所以首先解析选项正常。然后你就可以知道第一个操作数是什么了。在那时候,过程选项。将有关选项所需的信息存储在变量中。
action="$1"
shift
unset t_arg
while getopts "zhvdurqw:c:i:e:o:b:t:f:p:g" opt; do
case "$opt" in
c) c_arg="$OPTARG";;
…
esac
done
shift "$((OPTIND-1))"
root_arg="$1"
if [ -n "${c_arg+1}" ]; then
queue_callback "$OPTARG"
echo "$root_arg was here"
fi