有条件地从第二个文件bash读取

时间:2018-09-28 10:58:43

标签: bash

当从标准输入中读取while循环时,我正在努力如何从循环中处理标准输出/标准输入。

我曾尝试在主循环中使用其他文件描述符,但由于第二组var(空白或奇数数据)的回显而使我收到非常奇怪的结果。

例如:

grep something /tmp/from_some_file > /tmp/abc123
while IFS="," read -u 3  var1 var2 var3
do
  if [ $var1 = "abc" ] ; then
     flag=true
  fi
  grep var1 /tmp/second_file | read sec1 sec2 sec3
  echo "$var1/$var2/$var3  $sec1 : $sec2 : $sec3"
done  3< /tmp/abc123

出于此目的,我缩短了我正在运行的所有if检查并简化了名称/文件等。但这是基本检查。.sec1,sec2,sec3中的值要么为空白,要么为空白奇怪的价值观。

最初我没有<3重定向,结果相同,我也只是习惯于将整行拉入一个变量并将其附加到输出中,但是现在我需要将CSV文件分离为vars,所以我可以对这些值进行条件检查。

那么-如何在循环中同时运行两次读取?

当我设置-x时,我可以看到grep正在工作,我得到了我期望的CSV行,但是它们没有加载到sec1 / 2/3中

1 个答案:

答案 0 :(得分:1)

您的问题是,第二个read在子shell中运行,所有命令也在管道中运行,例如。 a=0; a=1 | a=2 | a=3; echo $a将打印0

grep ... | read sec1 sec2 sec3确实设置了这些变量,但是仅在单独的过程中运行read命令。

bash / ksh / zsh中最简单的方法是使用process substitution

read sec1 sec2 sec3 < <(grep var1 /tmp/second_file)

注意两个<之间的间隔。

您可以对主循环while ...; do ... ; done < <(...)执行相同的操作。