2012-09-25 138 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