1

我正在尝试处理我的 bash 脚本的可选参数和强制参数。我有以下脚本:

while getopts "a:x:" opt; do
  case $opt in
     a) echo "option a set: $OPTARG" ;;
     x) echo "option x set: $OPTARG" ;;
     \?) echo "Invalid option: -$OPTARG" >&2; exit 1;;
esac
done
shift $((OPTIND-1))

echo "mandatory argument $1"
echo "mandatory argument2 $2"

当我使用以下命令运行我的脚本时,一切看起来都很好:

./script.sh -a optionA -x optionX mandatory1 mandatory2

但是当我混合这个参数时:

./script.sh mandatory1 mandatory2 -a optionA -x optionX

它不...如何使其适用于所有参数组合?

4

2 回答 2

4

我认为,您可以在这两种论点之间进行迭代。

我认为这可以满足您的要求,并允许您用来--防止以下参数被解释为选项。

mandatory=()
while [ $# -gt 0 ] && [ "$1" != "--" ]; do
  while getopts "a:x:" opt; do
    case $opt in
       a) echo "option a set: $OPTARG" ;;
       x) echo "option x set: $OPTARG" ;;
       \?) echo "Invalid option: -$OPTARG" >&2; exit 1;;
  esac
  done
  shift $((OPTIND-1))

  while [ $# -gt 0 ] && ! [[ "$1" =~ ^- ]]; do
    mandatory=("${mandatory[@]}" "$1")
    shift
  done
done

if [ "$1" == "--" ]; then
  shift
  mandatory=("${mandatory[@]}" "$@")
fi

echo "mandatory argument ${mandatory[0]}"
echo "mandatory argument2 ${mandatory[1]}"

基本上,想法是使用 getopt 使用所有选项,然后手动使用所有非选项,然后再次使用 getopt 查找更多选项。

于 2014-02-13T14:31:28.087 回答
-2

为了使它工作,我必须在之后取消设置 OPTIND shift $((OPTIND-1))

[...]
shift $((OPTIND-1))
unset OPTIND
[...]
于 2017-09-14T20:04:15.940 回答