$ @から場所パラメータを削除する方法

$ @から場所パラメータを削除する方法

-infデフォルトでは、パラメータリストから最初の項目を「インポートしたい」と思います。 (残りのパラメータは他のコマンドに渡されます。)

私のスクリプトの構造は次のとおりです。

#!/bin/sh

<CODE>

for POSITIONAL_PARAM in "$@"
do

    <CODE>

    if [ "$POSITIONAL_PARAM" = '-inf' ]
    then
        <PLUCK $POSITIONAL_PARAM FROM $@>
        break
    fi

    <CODE>

done

<CODE>

some-other-command "$@"

# end of script

これを行うための良い方法はありますか?

ちなみに、私は主に適用される答えに興味がありますが、唯一の適用された/bin/sh答えにも興味があります/bin/bash

答え1

POSIX的に:

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"

上記のコードは、元のAlmquistシェルを除いて、POSIX以前のシェルでも実行されます(読み取り)。アメリカ)。ループをfor次のように変更します。

for arg
do
  ...
done

すべてのシェルで動作が保証されます。


別のPOSIX:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

この場合、POSIX以前のシェルで機能するには、最初のエントリを削除する(必要があります。(pattern)

答え2

-同様の問題を解決しようとしたときにこれを見つけましたが、オプションではなくすべてのパラメータ(で始まらないパラメータ)を受信した区切り文字まですべて処理したかったです--。処理されたパラメータを取り出し、残りのパラメータは指定された順序でそのままにしようとします。

これが私が思いついたものです。

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done

関連情報