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 に答える