我试图证明如何使用关联的筹码来收集计数。它在while循环中工作,但在while循环后似乎丢失了所有信息。我究竟做错了什么?除for循环中的一个以外的所有echo语句已添加用于调试。
#!/bin/bash
declare -A shell_type
shells=$(cut -d: -f7 /etc/passwd)
echo "$shells"|
while read sh
do
if [ -z "${shell_type[$sh]}" ]
then
shell_type[$sh]=1
else
let "shell_type[$sh] += 1"
fi
echo "$sh ${shell_type[$sh]}"
echo "${!shell_type[*]}"
echo "${shell_type[*]}"
done
echo "${shell_type[*]}"
for var in "${!shell_type[*]}"
do
echo "$var count is ${shell_type[$var]}"
done
不要通过管道传递到while
循环中,如下所示:
while read sh
do
...
done < <(cut -d: -f7 /etc/passwd)
如果您这样做,cmd | while
则while处于不同的过程中。它继承了局部变量,但无法修改它们。通过使用输入重定向,while
停留在当前进程内。
顺便说一句,首先<
是用于输入重定向,然后<(...)
是进程替换。您之间必须有一个空格,否则外壳程序将无法分隔这些运算符。您可以man bash
在“流程替代”部分中阅读有关流程替代的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句