web-dev-qa-db-ja.com

$ @から定位置パラメーターを削除する方法

基本的に、パラメータリストから最初に出現する-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にのみ該当する回答にも興味があります。

13
kjo

POSIXly:

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

printf '%s\n' "$@"

上記のコードは、オリジナルのAlmquistシェル(Read Endnote )を除いて、POSIX以前のシェルでも機能します。 forループを次のように変更します。

for arg
do
  ...
done

すべてのシェルで動作することを保証します。


別のPOSIXの1つ:

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

これを使用する場合、POSIX以前のシェルで機能させるには、(の最初の(pattern)を削除する必要があります。

20
cuonglm

同様の問題を解決しようとしたときにこの質問を見つけましたが、オプション以外のすべての引数(-で始まっていないもの)を、受け取った--セパレータまで処理したいと思いました。処理された引数のみを取り出し、残りの引数はそのままの状態でそのまま残したかったのです。

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

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