$@
関数呼び出し元の位置パラメータを読み書きする必要があります。 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_body
new_positional_parameters
答え2
ここにいくつかありますパラメータを繰り返しながら必要に応じて各パラメータを更新するコード。この場合、繰り返されるスラッシュを単一のスラッシュに置き換えます。
for param
do
param="$(printf %s. "$1" | tr -s "/")"
set -- "$@" "${param%.}"
shift
done