当从标准输入中读取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中
答案 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 < <(...)
执行相同的操作。