从变量读入变量

时间:2012-09-25 11:52:42

标签: bash

如何使用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。 ;)

4 个答案:

答案 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