変数抽出を関数にカプセル化し、関数内で使用するときにdeclare
がローカル変数を作成するという事実を利用できます。このテクニックは、関数が呼び出されるたびにファイルを読み込みます。あなたが行うことができ
input[0]='192.0.0.1'
input[1]='username'
input[2]='example.com'
input[3]='/home/newuser'
foo=bar
bar=baz
を::
$ a=$(readvar data input[1])
$ echo "$a"
username
$ readvar data foo
bar
これは、配列を読み、その名前を変更します:
readarray() {
# call like this: readarray filename arrayname newname
# newname may be omitted and will default to the existing name
while read -r line
do
declare "$line"
done < "$1"
local d=$(declare -p $2)
echo ${d/#declare -a $2/declare -a ${3:-$2}};
}
含む "データ" と呼ばれるファイルを考えると
readvar() {
# call like this: readvar filename variable
while read -r line
do
# you could do some validation here
declare "$line"
done < "$1"
echo ${!2}
}
例:
$ eval $(readarray data input output)
$ echo ${output[2]}
example.com
$ echo ${output[0]}
192.0.0.1
$ eval $(readarray data input)
$ echo ${input[3]}
/home/newuser
このようにすると、関数を1回呼び出すだけで、個々のクエリを作成する代わりに配列全体を使用できるようになります。
うわー!ありがとう、私はまだこれらをテストする機会がありませんでしたが、これは私が達成しようとしているもののために最も確実に機能すると確信しています。自動化されたサーバのインストールと設定 - システムを再現する必要があります!これらをテストするために週末に時間があるべきです。両方のおかげで! – jmituzas
すごくうまくいった!ありがとう – jmituzas
@jmituzas:Bash 4には、 "mapfile"の同義語である "readarray"と呼ばれる組み込み関数があります。これらのコマンドは、ファイルの行を配列に読み込みます。彼らは私の答えに示されているように可変設定をしませんが、あなたはおそらくその技術を融合させることができます。 –