2017-06-19 6 views
3

私のbashシェルスクリプトでは、コンマで区切られたキー、値のペアが単一の文字列の形であります。各キーと値を別々の変数に解析して格納する方法。
たとえば、
string1="key1=value1,key2=value2"


echo 'key1 = value1' >> key1.txt echo 'key2 = value2' >> key2.txt
string1のキーと値のペアの数は動的になります。どのようにシェルスクリプトでこれを行うには?
私はキーと値を取得するためにcutを使いました。しかし、私はどのように文字列のペアの数以上のループを確認していない。

string1='key1=value1' 
KEY=$(echo $string1 | cut -f1 -d=) 
VALUE=$(echo $string1 | cut -f2 -d=) 
+0

シェルを指定してください。多くの、非常に異なっている。また、いつもあなたが試したことのあるコードスニペットを含めてみてください。 –

+0

私が使用したコードを追加します。私はbashシェルを使用しています – Naresh

答えて

5
#!/bin/bash 

string1="key1=value1,key2=value2" 

while read -d, -r pair; do 
    IFS='=' read -r key val <<<"$pair" 
    echo "$key = $val" 
done <<<"$string1," 

注意を保証"$string1,"の末尾,は、readwhileループに入ることの最後の, - 分離されたトークン。

利回り:

key1 = value1 
key2 = value2 

は番号のファイルを順番にキーと値のペアを書き込むには(1で始まるkey<n>.txt、):

#!/bin/bash 

string1="key1=value1,key2=value2" 

i=0 
while read -d, -r pair; do 
    IFS='=' read -r key val <<<"$pair" 
    echo "$key = $val" > "key$((++i)).txt" 
done <<<"$string1," 
+2

@Naresh、bash> = 4の場合、後でキー/値ペアを使用する必要がある場合は、* associative配列*に値をロードすることもできます(例えば、 'declare -A pairs'、単純に 'pairs [$ key] =" $ val "'を実行して 'pairs'配列を作ることができます) –

-2

あなたはbashの話をしていると仮定すると、このような何かが動作することができます:

#!/bin/bash 

string1="key1=value1,key2=value2" 
OIFS="$IFS" 
IFS="," 

for pair in ${string1} 
do 
     declare $pair 
done 

IFS="$OIFS" 

echo $key1 
echo $key2 
+0

あなたの返信にDavideさんに感謝します。私の論理では、文字列そのものの内容を知りません。それはダイナミックになるでしょう。その場合、私はどのように私の文字列を解析することができます。私は質問した通りに質問を更新しました。 – Naresh

+2

引用符で囲まれていない展開に依存することは本当に残念です。これにより、IFS内の文字間の区別がなくなり(IFSがデフォルト値のときにタブをスペースとして表示するか、スペースのグループを単一スペースとして表示するか)、グロブも展開されます( '*'完全にローカルのファイル名に依存するアクションを持つ)。 –

+1

関連['for'で行を読まない](http://mywiki.wooledge.org/DontReadLinesWithFor)、[BashPitfalls#14](http://mywiki.wooledge.org/BashPitfalls#echo_.24foo) –

関連する問題