我试图证明使用联想的arrary收集计数。它在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
答案 0 :(得分:1)
不要管道到你的while
循环,写成这样:
while read sh
do
...
done < <(cut -d: -f7 /etc/passwd)
如果你cmd | while
,那么while处于不同的过程中。它继承了您的局部变量,但无法修改它们。通过使用输入重定向,while
保持在当前进程中。
顺便说一句,第一个<
用于输入重定向,之后的<(...)
是进程替换。你需要一个空间,否则shell不能分隔这些运算符。您可以在流程替换部分的man bash
中详细了解流程替换。