Bash の新しいバージョンではnamerefがサポートされています。nameref属性declare -n var_name
を指定するためvar_name
に使用します。namerefは、複数の値を返すために C++ 関数で一般的に使用される「参照渡し」機能を関数に提供します。Bashのmanページによると:
-nオプションをdeclareまたはlocal組み込みコマンドに使用してnameref属性を変数に割り当て、namerefまたは別の変数への参照を作成できます。これにより、変数を間接的に操作できます。nameref変数が参照または代入されるときは常に、nameref変数の値によって指定された変数に対して操作が実際に実行されます。namerefは、一般にシェル関数内で使用され、名前が関数に引数として渡される変数を参照します。
以下は、インタラクティブなコマンド ラインの例です。
例 1:
$ unset xx yy
$ xx=16
$ yy=xx
$ echo "[$xx] [$yy]"
[16] [xx]
$ declare -n yy
$ echo "[$xx] [$yy]"
[16] [16]
$ xx=80
$ echo "[$xx] [$yy]"
[80] [80]
$ yy=2016
$ echo "[$xx] [$yy]"
[2016] [2016]
$ declare +n yy # Use -n to add and +n to remove nameref attribute.
$ echo "[$xx] [$yy]"
[2016] [xx]
例 2:
$ func()
> {
> local arg1="$1" arg2="$2"
> local -n arg3ref="$3" arg4ref="$4"
>
> echo ''
> echo 'Local variables:'
> echo " arg1='$arg1'"
> echo " arg2='$arg2'"
> echo " arg3ref='$arg3ref'"
> echo " arg4ref='$arg4ref'"
> echo ''
>
> arg1='1st value of local assignment'
> arg2='2st value of local assignment'
> arg3ref='1st return value'
> arg4ref='2nd return value'
> }
$
$ unset foo bar baz qux
$
$ foo='value of foo'
$ bar='value of bar'
$ baz='value of baz'
$ qux='value of qux'
$
$ func foo bar baz qux
Local variables:
arg1='foo'
arg2='bar'
arg3ref='value of baz'
arg4ref='value of qux'
$
$ {
> echo ''
> echo '2 values are returned after the function call:'
> echo " foo='$foo'"
> echo " bar='$bar'"
> echo " baz='$baz'"
> echo " qux='$qux'"
> }
2 values are returned after the function call:
foo='value of foo'
bar='value of bar'
baz='1st return value'
qux='2nd return value'