2015-09-27 70 views
0

我试图使用进程替换进行while循环。在bash中工作的进程替换是zsh

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 

这在bash中正常工作,但不在zsh中。我得到这个错误:

test.sh: line 20: syntax error near unexpected token `<' 
test.sh: line 20: `done < <(zgrep 'Exception' $1)' 

我使用的是zsh 4.3.10。

我如何得到这个在zsh中工作?

UPDATE:已经修改了问题,分享完整的代码

+0

什么版本的'zsh',究竟是不是在那里工作? –

+0

这是一个简单的例子。我在实际脚本的while循环中做了更多的事情。 – mindreader

+0

'<(stuff)'是一种抨击。我怀疑它是在'zsh'中定义的。尝试命令替换'zgrep'异常'$ 1 |而......而不是。 –

回答

2

可以使用更常见管这个,而是:

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

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

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

感谢@ user000001指出必须使用大括号来组成命令,因此frequencyMapwhile循环之外可见。为什么这是必要的,请看这里:http://mywiki.wooledge.org/BashFAQ/024

+0

@ user000001:你指的是哪个变量? –

+0

@ user000001:谢谢你,我已经修复了它(我想!)。 –

+0

啊!我最初是这样做的,但由于局部变量问题,我改变了它。我会用大括号尝试它。谢谢! – mindreader