関数呼び出し元の位置パラメーター

関数呼び出し元の位置パラメーター

$@関数呼び出し元の位置パラメータを読み書きする必要があります。 Bashのマニュアルページは次のように述べています。

シェル関数は、単純なコマンドのように呼び出され、新しい位置引数のセットを使用して複合コマンドを実行するオブジェクトです。

したがって、$@呼び出されるたびに書き換えられます。いくつかの「特殊パラメータ」が見つかりましたが、何も見つかりませんでした。シェル変数はBASH_ARGV私の問題を解決しているようですが、shopt -s extdebug有効にする必要があります。これはマイコンピュータのデフォルトの動作ではなく、本番で有効になっているオプションでもありません。

extdebug
    If set, behavior intended for use by debuggers is enabled:
    ...
    4.     BASH_ARGC and BASH_ARGV are updated as described in their
           descriptions above.
    ...

$@Bashは関数を使用せずに関数呼び出し元に読み書きできますかBASH_ARGV? Bashが限られており、スクリプトに別のシェルを使用すると思いますか?

編集する:getopt私のヘルパーライブラリに素敵なラッパーが欲しいです。したがって、これに関連するすべての動作は関数の内部にあります。エラーかset --

答え1

関数は呼び出し元の位置パラメーターに影響を与えることはできません。これは意図的に設計されています。位置パラメータはその関数にのみ適用されます。

関数が配列で機能するようにします。

myfunction () {
  local _myfunction_arrayname=$1
  shift
  … # work on the positional parameters
  eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"

.ksh93とbashには、エイリアスと()組み込み関数をプロセス置換とsource組み合わせて何かを達成するためのバイパス方法があります。はい

alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'

関数の主なタスクを入れてmyfunction_body配列を設定しますnew_positional_parameters。呼び出し後、位置パラメータはmyfunction入力された値に設定されます。myfunction_bodynew_positional_parameters

答え2

ここにいくつかありますパラメータを繰り返しながら必要に応じて各パラメータを更新するコード。この場合、繰り返されるスラッシュを単一のスラッシュに置き換えます。

for param
do
    param="$(printf %s. "$1" | tr -s "/")"
    set -- "$@" "${param%.}"
    shift
done

関連情報