2012-09-25 51 views
0

如何使用IFS和變量「讀入」變量?從變量讀入變量

我想循環一些管道配對的數據進行拆分和工作。我得到的錯誤是read: 'site|database': not a valid identifier

SITES="abc|abc xyz|asdf" 
for site in $SITES; 
do 
    IFS="|" read domain database <<< echo $site; # es no bueno mi amigo 
    echo "Site: $domain \t\t\t Database: $database"; 
done; 

我只是這樣做的困難嗎?我不是一個土生土長的巴舍爾。 ;)

+0

都在這個片段中的分號沒用。 shell語法不是C :-) – Jens

+0

我來自另一種語言,對不起。 – Spechal

回答

1

您的腳本存在的問題是您沒有正確通過Here Stringread。它應該這樣做:

IFS=$"|" read domain database <<< "$site" # es no bueno mi amigo 

還記得引用該變量。

然後你的腳本就可以工作了。

這裏是固定的腳本:

SITES="abc|abc xyz|asdf" 
for site in $SITES 
do 
    IFS="|" read domain database <<< "$site" # es no bueno mi amigo 
    echo -e "Site: $domain \t\t\t Database: $database" 
done 

它打印:

Site: abc      Database: abc 
Site: xyz      Database: asdf 
+0

謝謝你這樣做爲什麼$需要這個工作以及引用這裏的字符串? – Spechal

+1

看看這裏的字符串的Bash腳本指南:http://tldp.org/LDP/abs/html/x17700.html 引用所有變量以保留特殊字符是一種很好的做法。 – dogbane

0

我認爲這是簡單的寫:

SITES="abc|abc xyz|asdf" 
for site in $SITES 
do 
    domain=${site%|*}  # removes everything from '|' onward 
    database=${site#*|} # removes everything up through '|' 
    echo "Site: $domain \t\t\t Database: $database" 
done 

有關${parameter%word}${parameter#word}符號信息,請參閱§3.5.3 Shell Parameter Expansion in the Bash Reference Manual

+0

感謝您對此的看法。我會閱讀你提供的鏈接。 – Spechal

1

你混合兩種語法:

read a b <<<$variable 

read a b < <(command) 

我想嘗試這個(不帶$IFS搞亂):

read domain database <<<${site/|/ } 
+0

您可以請我指向一個文檔或解釋$ {site/| /}的部分是「/ | /」嗎? – Spechal

+1

http://tldp.org/LDP/abs/html/string-manipulation.html - bash字符串操作。這個具體的是在「Substring Replacement」下面,用空格替換(只有第一個)'|'。 – Mat

+0

不幸的是,我只能接受一個答案,但你提供了一些很好的選擇,我很欣賞它。 – Spechal

0

IFS會影響到分詞,但文本仍然是逐行讀取的。但是(假設沒有您的記錄包含一個新行),你可以這樣做:

SITES="abc|abc xyz|asdf" 
echo "$SITES" | tr \| '\012' | while read domain database; do 
    echo "Site: $domain \t\t\t Database: $database"; 
done 

要澄清的第一句話,考慮的行爲如下:

echo "$SITES" | while read a b c; do echo "a=$a, b=$b"; done 

echo "$SITES" | while IFS=\| read a b c; do echo "a=$a, b=$b"; done 
+0

謝謝你對此的看法 – Spechal