如何在 while 循环中“读取”多个变量

hfr*_*nco 1 variables bash while-loop

如何使用 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
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

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

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")
Run Code Online (Sandbox Code Playgroud)

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

done < <( ...code for first list...) 3< <(...code for second list...)
Run Code Online (Sandbox Code Playgroud)

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

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

while read line_from_1; read1=$?;
      read line_from_2; read2=$?;
      (( read1 == 0 || read2 == 0 )); do
Run Code Online (Sandbox Code Playgroud)

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

while read line_from_1; read -u 3 line_from_2; do
    ...
done <<< "$first_line" 3<<< "$second_line"
Run Code Online (Sandbox Code Playgroud)

  • 是的; 当一个或另一个列表首先耗尽时,您可以通过多种方式进行处理,并且OP在问题中没有提到所需的行为是什么。 (2认同)
  • 当然,最好将 `echo "$first_list"` 和 `echo "$second_list"` 替换为实际生成它们的代码;这样内容就不需要存储在内存中。 (2认同)