bash getopts 无法识别第二个参数

bash getopts not recognizing the second argument

这是我的整个脚本的最简单形式。

#!/bin/bash
src=""
targ=${PWD}

while getopts "s:t:" opt; do
  case $opt in
    s)
      src=$OPTARG
      ;;
    t)
      targ=$OPTARG
      ;;
  esac
  shift $((OPTIND-1))
done

echo "Source: $src"
echo "Target: $targ"

我运行这个脚本为getopts_test -s a -t b

但是,它总是在 Target: 前面打印 pwd 而从不打印 b

我在这里错过了什么?

从未打印 b 的原因是循环中的 shift 在第一次迭代后将处理过的选项移走,即在打印 a 之后。使用 shift $((OPTIND-1)) 旨在访问可能的给定可变参数。自然地,一旦您删除 shifttarg 就会重新分配给 b,并且 ${PWD} 不再包含在其中,因为您没有字符串的连接(targ-t) 的选项。

@glenn-jackman 在他的评论中建议的替代方案 会是这样的:

#!/bin/bash
src=""
targ=${PWD}

while getopts "s:t:" opt; do
  case $opt in
    s)
      src=$OPTARG
      echo "Source: $src"
      ;;
    t)
      targ=$OPTARG
      echo "Target: $targ"
      ;;
  esac

done

shift $((OPTIND-1)) # Turning to non-option arguments say a file name and so on.

在这里,您无需 shifting 即可进行自然的论证。