【问题标题】:How do I “read” multiple variables on a while loop如何在 while 循环中“读取”多个变量
【发布时间】:2014-11-13 01:45:02
【问题描述】:

如何使用 while read 行读取多个变量?我正在尝试从这些多行变量创建一个 csv 文件。

不确定这是否是最好的方法。

例如:

1st_list=$(..code..)
2nd_list=$(..code..)

while read line_from_1, line_from_2
do
    echo "$line_from_1,$line_from_2" >> outputfile.csv

done < $1st_list,$2nd_list

【问题讨论】:

  • $1st_list$2nd_list 中的样本值是什么?
  • @anubhava $1st_list 和 $2nd_list 是多行的脚本变量。我正在尝试使用这些变量创建一个 csv 文件。不确定这是否是最好的方法。我会更新问题。
  • 您有两组要尝试组合的行到底如何? line1,line2? `line1field1,line2field1,l1f2,l2f2,....'?
  • &gt;&gt;outputfile.csvecho 移动到&gt;outputfile.csvdone 之后——这样您只打开一次输出文件,而不是重新打开它(然后关闭它)每次你想写一行。

标签: bash variables while-loop


【解决方案1】:

你的问题有点不清楚,但为了从多个源并行读取,你需要使用多个文件描述符,我认为,进程替换。

while read line_from_1; 
      read -u 3 line_from_2; do
    echo "From first: $line_from_1"
    echo "From second: $line_from_2"
done < <( echo "$first_list" ) 3< <(echo "$second_list")

(当然,如果这两个变量不存在,则您不必使用它们;只需将填充每个变量的代码放在为while 循环提供数据的适当进程替换中:

done < <( ...code for first list...) 3< <(...code for second list...)

)

正如所写,只要第二次读取成功(忽略第一次读取的退出状态),循环就会成功。只要两者都成功就循环,请使用read line_from_1 &amp;&amp; read -u 3 line_from_2

要在 either 成功时循环,您需要一个稍微复杂一点的迷你脚本作为while 条件:

while read line_from_1; read1=$?;
      read line_from_2; read2=$?;
      (( read1 == 0 || read2 == 0 )); do

更新:如果已经设置了变量来代替进程替换,您也可以在此处简单地使用字符串。 (我不确定3&lt;&lt;&lt; 是否合法。)

while read line_from_1; read -u 3 line_from_2; do
    ...
done <<< "$first_line" 3<<< "$second_line"

【讨论】:

  • $first_list 被清空时失败。
  • 是的;当一个或另一个列表首先用尽时,您可以通过多种方式处理,并且 OP 没有在问题中提到所需的行为是什么。
  • 当然,最好用实际生成它们的代码替换echo "$first_list"echo "$second_list";这样内容就不需要存储在内存中。
  • @CharlesDuffy 我会更明确地说明这一点。
  • 此外,从标准输入以外的其他内容读取的 POSIX 方法是使用 read line_from_2 &lt;&amp;3。我们已经通过使用进程替换放弃了 POSIX 合规性,因此我将对此进行修复(使用包含命令替换的 here-documents 或使用显式命名管道)作为读者练习。
【解决方案2】:

假设你想要作为输出

file1line1,file2line1
file2line2,file2line2
etc.

那么你根本不需要这样的东西,paste 正是这样做的。

paste -d, <(echo "$first_list") <(echo "$second_list")

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2020-11-11
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2010-12-04
    • 2016-01-10
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多