間接参照を使用する必要があるだけですが、そのためには、$1
最初に特殊パラメーターの値を通常のパラメーターに格納する必要があります。
!/bin/bash
. test1
var="$1"
# Only assign to flat if the variable specified in var is defined
if [ -n "${!var:-}" ]; then
flat="${!var}"; # assign value to var flat
echo "flat"
fi
まず、${!var}
in という名前の変数の値に展開しますvar
。が "foo" の場合var
は と同じ$foo
です。が「baz」の場合var
は と同じ$baz
です。
${var:-default}
var
が設定されていて、null 以外の値を持つ場合は、の値に展開されます。それ以外の場合は、':-' の後にあるものに展開されます。この場合は文字列のデフォルトです。文字列がない場合は、null 値が使用されます。そのため、設定されていない (または既に null 文字列であった)${var:-}
場合は、null 文字列に展開されます。var
2 つを組み合わせて${!var:-}
、変数 var を取得し、その値を変数名として使用します。次に、その変数を展開しようとし、設定されていないか null の場合は、null 文字列に展開します。したがって、var
がの場合la
、 の値に展開されますla
。がで、変数が設定されていない場合var
は、 null 文字列に展開されます。re
re
最後に、-n
演算子は引数の長さがゼロでないかどうかをテストします。つまり、 in という名前の変数を展開しようとした結果がvar
空文字列でないことを確認します。それが正しい場合は、もう一度展開して (はい、少し冗長です)、その値を に割り当てますflat
。
答えが上に書かれているようにflat
、スクリプトへの引数が で設定された変数の名前でない場合、変数は未定義ですtest1
。関係なく設定されても構わない場合flat
(たとえば、 )、ステートメントflat=""
は必要ありません。if
の値を設定するには、1 行を使用するだけですflat
。
#!/bin/bash
. test1
var="$1"
flat="${!var:-}"