【问题标题】:Issue with associative array in Bash scriptBash 脚本中的关联数组问题
【发布时间】:2013-12-05 04:48:34
【问题描述】:

我试图演示使用关联数组来收集计数。它在 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

【问题讨论】:

  • 如果您使用的是 4.2 或更高版本,您可以使用shopt -s last pipe 允许管道的最后一个命令在当前 shell(不是子 shell)中执行,这样可以消除您的问题。

标签: arrays bash associative


【解决方案1】:

不要通过管道连接到while 循环,这样写:

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

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

顺便说一句,第一个&lt; 用于输入重定向,之后的&lt;(...) 是进程替换。您需要在两者之间留一个空格,否则 shell 无法分隔这些运算符。您可以在 Process Substitution 部分的man bash 中阅读有关进程替换的更多信息。

【讨论】:

  • 谢谢!我还发现我需要删除 ${!shell_type[*]}; 周围的引号。否则它被视为带有嵌入空格的单个值。一个后续问题:两个小于 (
  • 好问题!我在答案中添加了解释。
  • 我相信我已经回答了自己的问题。第一个
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2010-10-15
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多