如何使用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;
我刚刚这么做了吗?我不是土生土长的Basher。 ;)
答案 0 :(得分:1)
你混合了两种语法:
read a b <<<$variable
和
read a b < <(command)
我试试这个(没有弄乱$IFS
):
read domain database <<<${site/|/ }
答案 1 :(得分:1)
您的脚本存在的问题是您没有正确地将Here String传递给read
。它应该这样做:
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
答案 2 :(得分: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。
答案 3 :(得分: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