シェルスクリプトを使用してキーで値を検索する必要があるファイルがあります。ファイルは次のようになります。
HereIsAKey This is the value
どうすれば次のようなことができますか:
MyVar=Get HereIsAKey
MyVar は「これが値です」と等しくなるはずです。キーには空白がなく、値はキーの後の空白に続くすべてである必要があります。
がファイル内で一意である場合HereIsAKey
は、grep でこれを試してください。
myVar=$(grep -Po "(?<=^HereIsAKey ).*" file)
Perl 互換の正規表現をサポートする grep がない場合は、次のように動作するようです。
VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
一度に1つの変数のみが必要な場合は、次のように実行できます。
#!/bin/bash
cat file | while read key value; do
echo $key
echo $value
done
このソリューションの問題:変数はループ内でのみ有効です。$key=$value
したがって、ループの後でそれを実行しようとしないでください。
更新:別の方法はI /Oリダイレクトです:
exec 3<file
while read -u3 key value; do
eval "$key='$value'"
done
exec 3<&-
echo "$keyInFile1"
echo "$anotherKey"
ファイルがソートされていない場合、ルックアップは遅くなります:
my_var=$( awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file )
ファイルがソートされている場合は、次のコマンドでより高速なルックアップを取得できます。
my_var=$( look HereIsAkey value-file | cut -d ' ' -f 2- )
get () {
while read -r key value; do
if [ "$key" = "$1" ]; then
echo "$value"
return 0
fi
done
return 1
}
2つのreturnステートメントは厳密には必要ありませんが、指定されたキーの検索の成功または失敗を示すための適切な終了コードを提供します。また、「キーの値に空の文字列がある」と「キーが見つかりませんでした」を区別するのにも役立ちます。
複数の言語で共有されるプロパティ ファイルを使用し、関数のペアを使用します。
load_properties() {
local aline= var= value=
for file in config.properties; do
[ -f $file ] || continue
while read aline; do
aline=${aline//\#*/}
[[ -z $aline ]] && continue
read var value <<<$aline
[[ -z $var ]] && continue
eval __property_$var=\"$value\"
# You can remove the next line if you don't need them exported to subshells
export __property_$var
done <$file
done
}
get_prop() {
local var=$1 key=$2
eval $var=\"\$__property_$key\"
}
load_properties
config.properties
get_prop は、ファイルの各行に一連の変数を設定するファイルから読み取り__property_...
ます。その後、get_prop は、読み込まれたプロパティに基づいて変数を設定できるようにします。必要なほとんどの場合に機能します。
はい、そこに eval があることは認識しています。これにより、ユーザー入力に対して安全ではなくなりますが、必要なことには機能します。