Bash脚本中的关联数组问题

时间:2013-12-05 04:48:34

标签: arrays bash associative

我试图证明使用联想的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

1 个答案:

答案 0 :(得分:1)

不要管道到你的while循环,写成这样:

while read sh
do
  ...
done < <(cut -d: -f7 /etc/passwd)

如果你cmd | while,那么while处于不同的过程中。它继承了您的局部变量,但无法修改它们。通过使用输入重定向,while保持在当前进程中。

顺便说一句,第一个<用于输入重定向,之后的<(...)是进程替换。你需要一个空间,否则shell不能分隔这些运算符。您可以在流程替换部分的man bash中详细了解流程替换。