2017-06-19 19 views
3

在我的bash shell腳本中,我有一個逗號分隔的鍵值對,形式爲單個字符串。如何解析並將每個鍵和值存儲在單獨的變量中。
例如,
string1="key1=value1,key2=value2"

我想將其轉換爲
echo 'key1 = value1' >> key1.txt echo 'key2 = value2' >> key2.txt
string1中的鍵值對的數量是動態的。如何在shell腳本中做到這一點?
我已經使用cut來獲得關鍵和價值。但我不確定如何在一串字符串中循環多少個字符串。

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

請指定哪些殼;有很多,彼此非常不同。另外,總是儘量在你嘗試過的代碼中加入一段代碼。 –

+0

添加我使用過的代碼。順便說一句我正在使用bash shell – 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,",,這確保了read也進入while循環last, -separated token。

收率:

key1 = value1 
key2 = value2 

要寫入的鍵 - 值對到順序編號的文件(key<n>.txt,從1):

#!/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中,如果您需要在代碼中稍後使用鍵/值對(例如'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) –

相關問題