下面的答案的结果

下面的答案的结果

我有一个像这样上课的脚本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

相关内容