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


13

基本的に、-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


@cuonglm:擬似コードの元の形式に戻しました。私の経験では、絵を単純化しすぎると、単純化された場合には有効な答えが得られますが、実際の場合には当てはまりません。
kjo

回答:


20

POSIXly:

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

printf '%s\n' "$@"

上記のコードは、元のAlmquistシェル(Endnoteを読む)を除き、POSIX以前のシェルでも動作します。forループを次のように変更します。

for arg
do
  ...
done

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


別のPOSIXのもの:

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

これを使用すると、前のPOSIXシェルで機能するように、最初(に削除する必要があります(pattern)


ありがとう。その引数サイクリングのテクニックはとてもいいです。現在のパラメータに続くパラメータを非常に簡単に検査できるという追加のボーナスがあります(ちょうどそこに座っているため$1)。このプロパティは、私がやっていることで役に立ちました。また、ループin "$@"; の先頭のビットforは不要であることを思い出してくれてありがとう。それは私が前に見たものですが、私はそれを忘れがちです。Almquistシェル上のあなたの発言については、ないdo 持って次の行に表示されるように、またはでしょうfor arg; doあまりにも動作しますか?
kjo

1
for arg; doアルム
キスト

2
は初歩のfor arg doための速記のイディオムですfor arg in "$@"; do。それは私を約5秒間投げました!後者の方が読みやすいと言う人もいるかもしれません:)
スターフライ

0

同様の問題を解決しようとしてこの質問を見つけまし-たが、受け取った--セパレーターまでのすべての非オプション引数(で始まらないもの)を処理したかったのです。処理済みの引数のみを抜き取り、残りの引数を指定された順序でそのまま残したかったのです。

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

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.