进程替换在bash中工作,但不是zsh

进程替换在bash中工作,但不是zsh,bash,zsh,process-substitution,Bash,Zsh,Process Substitution,我正在尝试使用进程替换向while循环提供数据 logFile=$1 declare -A frequencyMap while read line do name=$(echo $line | awk '{print $11}') if [ ${frequencyMap[$name]+_} ] then frequencyMap[$name]=$(expr ${frequencyMap[$name]} + 1) else frequencyMap[$name]=1

我正在尝试使用进程替换向while循环提供数据

logFile=$1
declare -A frequencyMap

while read line
do

 name=$(echo $line | awk '{print $11}')

 if [ ${frequencyMap[$name]+_} ]

   then frequencyMap[$name]=$(expr ${frequencyMap[$name]} + 1)

   else frequencyMap[$name]=1

 fi

done < <(zgrep 'PersonalDetails' $logFile)

for key in "${!frequencyMap[@]}"
do 
 echo "$key ${frequencyMap[$key]}"
done | sort -rn -k2
logFile=$1
声明-频率映射
读行时
做
名称=$(echo$行| awk'{print$11}')
如果[${frequencyMap[$name]+\}]
然后frequencyMap[$name]=$(expr${frequencyMap[$name]}+1)
else frequencyMap[$name]=1
fi

完成<您可以使用更常见的管道来完成此操作:

zgrep 'PersonalDetails' "$logFile" |
{
  while read line
  do
    # ...
  done

  for key in "${(k)frequencyMap[@]}"
  do 
    echo "$key ${frequencyMap[$key]}"
  done | sort -rn -k2
}

这不仅是更便携的,我认为它更可读,因为流程从打开输入文件开始。


感谢@user000001指出必须使用大括号来编写命令,以便
frequencyMap
while
循环外可见。如需了解原因,请参阅此处:

zsh的哪个版本以及它在那里不起作用的具体方式?这是一个简化的示例。在实际的脚本中,我在while循环中做了更多的事情。我该如何将其转换为。。。。zshism?:|
zsh
应该支持流程替换(它在我的一次快速测试中(CentOS 5上的版本4.2.6)中做过,并在中列出为支持它)。我想它可能是一个编译时特性或者其他什么。你确定你在那里用
zsh
进行测试,而不是
/bin/sh
(或者
zsh
在一些
sh
-compat模式下)?@user000001:你指的是哪个变量?@user000001:谢谢你,我现在(我想!)已经修好了。啊!起初我是这样做的,但由于局部变量的问题,我改变了它。我要用牙套试试。谢谢但是,
zsh
中不需要大括号;管道中的最后一个命令在当前shell中执行,而不是在子shell中执行。
zgrep 'PersonalDetails' "$logFile" |
{
  while read line
  do
    # ...
  done

  for key in "${(k)frequencyMap[@]}"
  do 
    echo "$key ${frequencyMap[$key]}"
  done | sort -rn -k2
}