別の変数の名前でシェル変数の拡張値を使用するには?

別の変数の名前でシェル変数の拡張値を使用するには?

私は次のことを行うことを非常に熱望しています。

#!/bin/bash
MARCOMIN=1
MARCOMAX=3
ENZOMIN=1
ENZOMAX=3
GIOVANNIMIN=1
GIOVANNIMAX=3
VALUEMARCO=12
VALUEGIOVANNI=4
VALUEENZO=12

for i in MARCO ENZO GIOVANNI; do
        echo $$iMIN is $i\'s MIN
        echo $$iMAX is $i\'s MAX
        echo $VALUE$i is $i\'s VALUE
done

exit 0

しかし、私が望むようにマクロは作成されません。

me@myhost:~$ bash test.sh
20341iMIN is MARCO's MIN
20341iMAX is MARCO's MAX
MARCO is MARCO's VALUE
20341iMIN is ENZO's MIN
20341iMAX is ENZO's MAX
ENZO is ENZO's VALUE
20341iMIN is GIOVANNI's MIN
20341iMAX is GIOVANNI's MAX
GIOVANNI is GIOVANNI's VALUE

明らかにこれは私のテストの1つだけです。このようにマクロを書くためにいくつかの方法を試しましたが、修正することはできません。こことSOで同様の質問をたくさん見つけましたが、私の状況に合った質問はありません。

bash -x test.sh次のように:

+ MARCOMIN=1
+ MARCOMAX=3
+ ENZOMIN=1
+ ENZOMAX=3
+ GIOVANNIMIN=1
+ GIOVANNIMAX=3
+ VALUEMARCO=12
+ VALUEGIOVANNI=4
+ VALUEENZO=12
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'MARCO'\''s' MIN
21466iMIN is MARCO's MIN
+ echo 21466iMAX is 'MARCO'\''s' MAX
21466iMAX is MARCO's MAX
+ echo MARCO is 'MARCO'\''s' VALUE
MARCO is MARCO's VALUE
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'ENZO'\''s' MIN
21466iMIN is ENZO's MIN
+ echo 21466iMAX is 'ENZO'\''s' MAX
21466iMAX is ENZO's MAX
+ echo ENZO is 'ENZO'\''s' VALUE
ENZO is ENZO's VALUE
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'GIOVANNI'\''s' MIN
21466iMIN is GIOVANNI's MIN
+ echo 21466iMAX is 'GIOVANNI'\''s' MAX
21466iMAX is GIOVANNI's MAX
+ echo GIOVANNI is 'GIOVANNI'\''s' VALUE
GIOVANNI is GIOVANNI's VALUE
+ exit 0

ベストアンサー1

バッシュサポート可変間接:

#!/bin/bash
MARCOMIN=1
MARCOMAX=3
ENZOMIN=1
ENZOMAX=3
GIOVANNIMIN=1
GIOVANNIMAX=3
VALUEMARCO=12
VALUEGIOVANNI=4
VALUEENZO=12

for i in MARCO ENZO GIOVANNI; do
    for j in MIN MAX VALUE; do
        varname="${i}${j}"
        # For VALUE we need reverse order of i and j
        [[ $j = VALUE ]] && varname="${j}${i}"

        printf "%d is %s's %s\n" "${!varname}" "$i" "$j"
    done
done

exit 0

内部ループを使用して追加の操作を実行し、代わりに使用しprintfましたが、echo重要なアイデアは、foo他の変数に格納されている変数名が与えられたら、それを実行してbar値を取得できることです。$foo${!bar}

もっと:https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean

おすすめ記事