間接参照を使用する必要があるだけですが、そのためには、$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 文字列に展開されます。rere
最後に、-n演算子は引数の長さがゼロでないかどうかをテストします。つまり、 in という名前の変数を展開しようとした結果がvar空文字列でないことを確認します。それが正しい場合は、もう一度展開して (はい、少し冗長です)、その値を に割り当てますflat。
答えが上に書かれているようにflat、スクリプトへの引数が で設定された変数の名前でない場合、変数は未定義ですtest1。関係なく設定されても構わない場合flat(たとえば、 )、ステートメントflat=""は必要ありません。ifの値を設定するには、1 行を使用するだけですflat。
#!/bin/bash
. test1
var="$1"
flat="${!var:-}"