在shell脚本中混合awk命令,而循环和变量在循环后不保留其值?

在shell脚本中混合awk命令,而循环和变量在循环后不保留其值?,shell,awk,while-loop,Shell,Awk,While Loop,嗨,伙计们,我为这个尴尬的标题感到抱歉,但我认为它有点难以形容。这里是我的问题,我想在while循环中保留一个计数I,它从awk读取输入,然后在循环后打印I的值。然而,在循环之后,我变回零。下面是我的程序的一个简化版本,实际上我还在循环中进行了一些字符串匹配,因此跳过了一些行,并且没有增加 我试图删除awk并执行另一个普通while循环,循环后保留I的值,因此我相信这不是由于语法错误 任何想法都非常感谢 #!/bin/bash arr=(); i=0; awk -F '{print $1}' S

嗨,伙计们,我为这个尴尬的标题感到抱歉,但我认为它有点难以形容。这里是我的问题,我想在while循环中保留一个计数I,它从awk读取输入,然后在循环后打印I的值。然而,在循环之后,我变回零。下面是我的程序的一个简化版本,实际上我还在循环中进行了一些字符串匹配,因此跳过了一些行,并且没有增加

我试图删除awk并执行另一个普通while循环,循环后保留I的值,因此我相信这不是由于语法错误

任何想法都非常感谢

#!/bin/bash
arr=();
i=0;
awk -F '{print $1}' SOMEFILE | while read var
do
  echo $var;
  arr[i]=$var;
  i=$((i+1));
  echo $i;
done
echo $i;

因为while循环在管道中,所以它作为子流程运行,并且i的值是该子流程的本地值。有几种方法可以保持价值;使用命名管道,而不是在管道中运行,使用进程替换,或使用插值的heredoc。下面是后者的一个例子:

while read var; do ... done << EOF
$( awk ... )
EOF

谢谢,威廉,你能详细说明一下吗?我对shell脚本非常陌生,例如,您是否建议在while循环之后放置awk?nvmd,我已经修改了我的程序,如下所示,它可以工作。谢谢!bin/bash i=0;arr=;读var时不回显$var;arr[i]=$var;i=$i+1;done@ArrowCen:如果您使用的是Bash、ksh或zsh,您可以使用进程替换,William提到了这一点,但没有说明:而。。。完成<