次の内容を含む構成ファイルがあります。
variable1 = 25
variable2 = 36
Bashスクリプトでこのファイルを解析し、各変数をスクリプトの正しい値に設定したいと思います。どうすればいいですか?私のコードは一番下にありますが、内容を表示するだけです。実際にスクリプトで変数とその値を設定してから、特定の変数が(擬似コード)などの条件を満たしていることを確認したいと思います。
「variable1=25」の場合、「OK」をエコーします。
IFS="="
while read -r name value
do
echo "Content of $name is ${value//\"/}"
done < filename
答え1
1つのオプションはファイルの構文を変更し、シェルファイルを直接解析。欠点は、シェルが有効な構文を解析できる必要があり、実際に実行スクリプトのコンテキスト内で構成ファイルをコードとして実行することです。
幸いにもすでに表示しておきましたbash
。シェルが連想配列をサポートしているので、これは良いことです。これにより、シェルが値を解析または評価することなくこれらの値を読み取ることができるため、構成ファイルの内容を信頼しすぎる必要がなくなります。
構成設定が1行に1つずつあると仮定すると、次のコードを使用して読み取ることができます。
#!/bin/bash
#
declare -A config
while IFS=$'[ \t]*=[ \t]*' read -r name value
do
echo "Read name=$name, value=$value" >&2
config[$name]="$value"
done
"${config[$name]}"
次の参照を使用して参照できます。
echo "variable1=${config[variable1]}, variable2=${config[variable2]}." >&2
この構造は動詞に記号の周りの空白を無視するようにIFS=$'[ \t]*=[ \t]*'
指示するので、 とは同じです。read
=
fruit=pear
fruit = pear
答え2
私は別のアプローチを提案したいと思います。変数ファイルはシェル構文の代入と非常によく似ています。唯一の問題は、割り当て演算子の周りの空白です(詳細はここで確認できます)。ここ)。まずsed
、次のコマンドを使用してスペースを変更できます。
$ cat vars.txt
variable1 = 25
variable2 = 36
$ sed -i 's/ = /=/' vars.txt
$ cat vars.txt
variable1=25
variable2=36
これを完了したら、source
必要に応じてすべての変数を使用してファイルを設定します。
#!/bin/bash
source vars.txt
echo "Variable 1: $variable1, Variable 2: $variable2"
結果は次のとおりです。
Variable 1: 25, Variable 2: 36
Roaimaがコメントで指摘したように、このアプローチにはセキュリティ上の問題があります。ファイルを作成すると、source
実際にはそのファイルがシェルスクリプトとして実行されます(スクリプトの実行とスクリプトのインポートの説明)。ここ)。これは、ファイルの内容を信頼する必要があることを意味します。悪意のあるユーザーやプロセスがファイルを編集できる場合は、最終的に任意のコマンドを実行する可能性があります。
また、roaimaが指摘したように、変数の値に特殊文字が含まれている場合は、変数を引用する必要があります。この回答は、変数の数値のみを含む質問のデータセット用に特別に書かれています。他のタイプの値に簡単に拡張できません。