私は次のことを行うことを非常に熱望しています。
#!/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