进程替换在bash中工作,但不是zsh
我正在尝试使用进程替换向while循环提供数据进程替换在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
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
}