bashの間接参照および/またはnameref
この質問に遅れて来る、そして他の答えがnamerefについて教えていないので...
${!var}
間接構文の使用:
~$ someVariable='Some content'
~$ var=someVariable
~$ echo $var
someVariable
~$ echo ${!var}
Some content
namref(declare -n
)構文の使用
namerefを使用すると、変数の内容を表示できるだけでなく、変数にデータを入力して属性を取得または設定できます。
~$ someVariable='Some content'
~$ declare -n var=someVariable
~$ echo $var
Some content
この構文は、関数に役立ちます。
function showVarDetail() {
local -n var=$1
printf 'Variable \47\44%s\47 is %d len, has [%s] flags and contain: %q\n' \
"$1" "${#var}" "${var@a}" "$var"
}
(注:この関数は単なるサンプルです。これでは、配列と連想配列が正しく展開されません!)
それで
~$ someVar='Hello world!'
~$ showVarDetail someVar
Variable '$someVar' is 12 len, has [] flags and contain: Hello\ world\!
~$ declare -r PI=3.14159265358979323844
~$ showVarDetail PI
Variable '$PI' is 22 len, has [r] flags and contain: 3.14159265358979323844
namerefを使用して変数値を設定する
これは両方の方法で機能する可能性があります!
これは、2つの変数名を引数として実行するための小さなサンプル関数です。最初の変数には文字列が含まれている必要があり、2番目の変数には1番目の変数コンテンツの1文字が入力され、次に1番目の変数コンテンツが1文字シフトされます。
shift1char <variable string source> <variable target>
shift1char () {
local -n srcStr=$1 tgtVar=$2;
tgtVar=${srcStr::1} srcStr=${srcStr:1}
}
それで
~$ someVar='Hello world!'
~$ shift1char someVar someChar
~$ showVarDetail someVar
Variable '$someVar' is 11 len, has [] flags and contain: ello\ world\!
~$ showVarDetail someChar
Variable '$someChar' is 1 len, has [] flags and contain: H