シェルスクリプトで動的変数に保存されたコンテンツを生成する

シェルスクリプトで動的変数に保存されたコンテンツを生成する

以下のコードで困っています。助けていただければ幸いです。

動的に生成された変数内の内容を別の変数に割り当てようとしています。しかし、変数の値が割り当てられる代わりに、変数名が割り当てられていることがわかります。(echo/eval/!) を試しましたが、何も機能しません。誰か解決策を教えてくれませんか?

目的: 値24(変数に保存)を割り当てるmsd_ext_len) に最終カウント変数。

変数宣言

iter_val=1

var_1="msd_ext"

msd_ext_len=24

コード:

eval "final_count"=\${var_${iter_val}}_len

出力 -->msd_ext_len

予想される出力 -->24

上記のコードに加えて、以下に示すようにもう 1 行のコードを追加すると、出力は次のようになります。

count_val=${!final_count}

しかし、これらの 2 行のコードを 1 行のコードにまとめることはできるでしょうか?

答え1

${var_${iter_val}}したがって、まず、 のような操作(つまり、変数名に数字を追加する操作) を実行するたびに、代わりに配列を使用する必要があります。

arr=(a b c)
arr[1]=x
i=1
echo "${arr[i]}"

何かをインデックスする必要がある場合文字列代わりに、連想配列 ( declare -A arraynameBash の場合) を使用します。

これらを組み合わせて、配列内のいくつかの「オブジェクト」に異なるプロパティを持たせるというのは、より困難です。 2 つの別々の配列を使用してから、foo[i]と を使用することができますbar[i]

それでも名前によってそれらの配列を間接的にポイントする必要がある場合は、名前参照が必要です。

foo=(a b c)
bar=(x y z)
declare -n arrname=foo
echo "${arrname[i]}"

コードからはデータ構造が正確にどのようなものであるかわかりませんので、そのシナリオについてのみ回答することは困難です。


例を書き直すと、次のようになります。

varnames=()
varnames[1]=msd_ext
varnum=1
msd_ext_len=24

declare -n srcvar="${varnames[varnum]}_len"
declare -n dstvar=final_count
dstvar=$srcvar

echo $final_count

varnamesネストされた展開は${var_$foo}実際には機能しないため、には配列を使用する必要があります。

見る:

関連情報