Shift: グローバル版はありますか?

Shift: グローバル版はありますか?

引数リストを解析するために、一般的なトップダウン解析スキームを実装しようとしました。

なぜ関数が動作しないのか不思議に思いましたeat()。位置引数 $1、$2、$3、... がその特定の関数のコンテキスト内にあるためです。実際のスクリプトのものではありません。残念です。私はまだ bash に慣れていません。

したがって、私の質問は、それが正しいとすれば、シフトの範囲も私のeat()機能のコンテキストであるということですか?

スクリプト引数を別の関数内からシフトする方法は本当にないのでしょうか? : (

[つまり、すべてのロジック (通常はトップダウン パーサーに準拠) を case ステートメントで実装する必要があります。(!?)]

答え1

関数は渡された引数のすべて(またはサブセット)を返すことができ(たとえばグローバル配列経由)、呼び出しスクリプトはそれを使用して独自の引数を設定できます。例:

#!/bin/bash

declare -a args

nofoo() {
  # we don't like "--foo", it is forbidden!
  for a in "$@"; do
    [ "$a" != "--foo" ] && args+=("$a")
  done
}

nofoo "$@"
set -- "${args[@]}"

help setbashから:

セット:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

シェル オプションと位置パラメータの値を設定または設定解除します。

シェル属性と位置パラメータの値を変更したり、シェル変数の名前と値を表示したりします。

[...]

-- 残りの引数を位置パラメータに割り当てます。残りの引数がない場合、位置パラメータは設定されません。

関連情報