次のような効果を得たいのですが、方法がわかりません。
$> A='/dir'
$> B="$A/bin"
$> echo $B
/dir/bin
$> A='/other'
$> echo $B
/other/bin
どんなアイデアがありますか?
答え1
Ksh93には、ある変数が別の変数への間接参照になる可能性がある限られた形式があります。
$ A=/dir
$ typeset -n B=A
$ echo $B
/dir
$ A=/other
$ echo $B
/other
一般的なシェルは変数を2回拡張しません。 Bashはkshの間接参照機能と似ていますが、構文が異なります。定義時ではなくアクセス時に間接参照を希望するように指定する必要があります。
$ A=/dir
$ B=A
$ echo ${!B}
/dir
$ A=/other
$ echo ${!B}
/other
通常、変数の値は変数に割り当てられたときにのみ変更されます。訪れるたびに再計算されることを望むなら、コマンド出力の検索。
PATH
などの他のプログラムで使用される変数の値を動的に変更したい場合は、LD_LIBRARY_PATH
シェルの高度な機能が何であれ、これは不可能です。プログラムが起動すると、その環境変数は起動時に受け取ったのと同じ変数です。シェルで値を変更しても、すでに実行されているプロセスの値には影響しません。
一部のイベントに応じてこれらの変数の値を変更するには、シェルコードを実行するだけです。たとえば、bashにいくつかのコードを実行するように要求できます。プロンプトが表示されるたびにまたは現在のディレクトリが変更されたとき。繰り返しますが、これはすでに実行されているプログラムには影響しません。
答え2
テンプレート変数のようなものが必要な場合はeval
拡張できます。
A=/dir
B=\$A/bin
eval echo $B
A=/other
eval echo $B
答え3
変数はこのように動作しません。あなたが望むものは一つです。機能:
B () {
echo "$A/bin"
}
A=/dir
echo $(B)
A=/other
echo $(B)