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;

我只是在艰难地这样做吗?我不是土生土长的巴舍尔。;)

4

4 回答 4

1

您正在混合两种语法:

read a b <<<$variable

read a b < <(command)

我会试试这个(不要弄乱$IFS):

read domain database <<<${site/|/ }
于 2012-09-25T11:59:15.510 回答
1

您的脚本的问题是您没有正确传递Here字符串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
于 2012-09-25T12:12:27.000 回答
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

有关和符号的信息,请参阅Bash 参考手册中的 §3.5.3 Shell 参数扩展${parameter%word}${parameter#word}

于 2012-09-25T11:58:42.303 回答
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
于 2012-09-25T12:01:48.823 回答