machine1という変数をmachine $ counter(counter = 1の間)として定義できますか?
たとえば、次のファイルを作成し、/tmp/config.txt
machine1を配列に設定しました。
$ more /tmp/config.txt
machine1=( linux_server critical 1.1.1.1 )
machine2=( linux_server critical 1.1.1.2 )
.
.
次に、次のような簡単なスクリプトを作成して、/tmp/config.txt
次のようにマシン配列を印刷してみました。
$ more read.config.bash
#!/bin/bash
source /tmp/config.txt
counter=1
echo ${machine$counter[0]}
echo ${machine$counter[1]}
echo ${machine$counter[2]}
.
.
ただし、スクリプトを実行すると、次の結果が表示されます。
$ ./read.config.bash
./read.config.bash: line 6: ${machine$counter[0]}: bad substitution
./read.config.bash: line 7: ${machine$counter[1]}: bad substitution
./read.config.bash: line 8: ${machine$counter[2]}: bad substitution
この問題に対する解決策は何ですか?
答え1
eval
コマンドを使用してください。
eval "echo \${machine${counter[0]}}"
最初の項目はエスケープされるため、$
文字列が処理される前に評価されません。eval
どのように機能するかは、eval
コマンドプロンプトにコマンドを入力するのと同じようにコマンドを実行することです。違いは、実行される命令をプログラム的に設定できることです。
したがって、あなたのシナリオeval
でコマンドを実行すると、コマンドは次のようになります。実際に実行は次のとおりです。echo ${machineBLAH}
.内部変数置換はシェルでのみ行われました。今後 eval
走る。
詳細については、次の記事を参照してください。Bashの「eval」コマンドは何ですか?。
答え2
使用を避けることができますeval
source /tmp/config.txt
counter=1
line0="machine$counter[0]"
echo ${!line}
echo
ループ経由で呼び出す方が良い
for counter in 1 2 3
do
line="machine$counter[@]"
for element in "${!line}"
do
echo $element
done
done