シェルスクリプトを使用してキーで値を検索する必要があるファイルがあります。 「これが値である」シェルスクリプトからファイル内のキー/値を解析するコード
MyVar=Get HereIsAKey
、その後のMyVarが等しくなければならない:
HereIsAKey This is the value
がどのように私のような何かを行うことができます。ファイルは次のようになります。キーには空白がなく、値はキーの後の空白に続くすべての値でなければなりません。
シェルスクリプトを使用してキーで値を検索する必要があるファイルがあります。 「これが値である」シェルスクリプトからファイル内のキー/値を解析するコード
MyVar=Get HereIsAKey
、その後のMyVarが等しくなければならない:
HereIsAKey This is the value
がどのように私のような何かを行うことができます。ファイルは次のようになります。キーには空白がなく、値はキーの後の空白に続くすべての値でなければなりません。
HereIsAKey
があなたのファイルに一意である場合、grepのでこれを試してみてください。
myVar=$(grep -Po "(?<=^HereIsAKey).*" file)
ファイルがソートされていない場合には、検索が遅くなります。
my_var=$(awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file)
ファイルがソートされている場合は、Aのみで一つの変数が必要な場合は、
my_var=$(look HereIsAkey value-file | cut -d ' ' -f 2-)
それはCentOSの5で正常に動作します! –
"Lookユーティリティはバージョン7のAT&T Unixに登場しました。" – hagello
で速い検索を得ることができますあなたは次のようなことをすることができます:
#!/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"
代入の左辺はパラメータの拡張ではありません – chepner
代入の解が見つかりました –
これは本当に不必要に冗長な修正です。あなたの既存の 'while read'ループをとり、最初に' cat file'の代わりに '
私は全体で共有されるプロパティファイルを使用します複数の言語は、私は関数のペアを使用します。
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
読み取りファイル内の各行に変数__property_...
を設定したconfig.properties
ファイルから、get_propは、ロードされたプロパティに基づいて変数の設定を許可します。それは必要とされるほとんどの場合に有効です。
はい、私はそれにの安全ではないが、それはそれが私がそれに必要なもののために働くことを意味する評価がそこにあることを認識します。
get() {
while read -r key value; do
if [ "$key" = "$1" ]; then
echo "$value"
return 0
fi
done
return 1
}
2つのreturn文は厳密には必要ではありませんが、特定のキーを見つける際の成功または失敗を示す良い終了コードを提供します。また、「キーに空の文字列があります」と「キーが見つからない」の区別に役立ちます。
あなたはPerl互換の正規表現をサポートしていますグレップをお持ちでない場合は、次のように動作しているようです:
VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
これは読みやすく、移植性が高いだけでなく、 equalsを切り捨てると変数の空白のサイズも扱えます: 'grep"^$ KEY "$ FILE | cut -d '=' -f2-' – 7yl4r
素晴らしい! 1つの質問は私がスクリプトに慣れているからです。私はGetConfigValueのような関数を必要とし、パラメータとしてHereIsAKeyをとります。渡されたパラメータを正規表現にどのように入れることができますか? –
これは問題ありません:echo "(grep -Po \"(?<=^"" $ 1 "")。* \ "ファイル)"ですが、変数に代入するのに問題があります。 MyParam:コマンドが見つかりません。 –
気にしないでください。それを得ました:REGEXP = "grep -Po \"(?<=^$ {1})。* \ "ファイル" –