清空Bash关联数组中的所有元素

5

我需要在Bash中从关联数组中删除所有键和值。使用的是GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)版本。不能仅仅使用unset命令,因为我需要在一个函数内完成此操作。如果使用unset命令并再次使用declare声明,那么该数组将只存在于函数内部。

arrayFunction()
{
    # Start the array Clearer
    unset workingArray
    declare -A workingArray
    # End the array Clearer

    workingArray[test]="bar"
    echo "Inside the function: ${workingArray[test]}"
}

declare -A workingArray

workingArray[test]="foo"

echo "Before the function: ${workingArray[test]}"

arrayFunction

echo "After the function: ${workingArray[test]}"

输出:

Before the function: foo
Inside the function: bar
After the function:

输出的最后一行应该是bar

我要找的是一些放在函数内部的代码,以完全清空数组,同时保持该数组为全局变量。

3个回答

6

这并不复杂,只需使用-g即可。

在你的函数内部:

declare -gA workingArray

并且这将在全球范围内发生。


1
哇,显然有些非常愚蠢的简单东西,我本可以在5秒钟内通过“declare --help”找到。谢谢! - Feldspar15523
1
更具体地说,“在函数中使用时,除非使用-g选项,否则declare将使每个名称本地化,就像使用local命令一样。” - Solomon A.

2
这个问题要求 "删除所有键和值"。但是,从示例代码来看,似乎请求是用新的键/值集合替换所有现有的键和值。可以通过对关联数组进行赋值来实现这一点。
arrayFunction()
{
    workingArray=( [test]="bar" )
    echo "Inside the function: ${workingArray[test]}"
}

如果新的键/值集是动态的,那么可以逐步建立。
arrayFunction()
{
    # Start with empty set
    workingArray=()
    workingArray[test]=bar
    workingArray[lazy]=dog
    # Additional assignments
    echo "Inside the function: ${workingArray[test]}"
}

在这两种情况下,无需重新声明数组。


0
TLDR: 使用 unset
unset arr
declare -A arr # -g doesn't matter to the root of the question

解释

我发现如果需要在同一作用域内重置数组,declare -gA arr 是不够的。例如:

for file in `ls`; do
  declare -gA one_file
  safe_file=$(echo $file | tr '.' '_')  # simplified; mileage may vary
  one_file[${safe_file}]=foo
  printf "%s\n" "${!one_file[@]}"
done

输出:

# what you'd expect if the array is never cleared out
(a lot of files -- file 1, file 2, ..., file i for i in range (1, N)) 

解决方案

有效的方法是使用unset

for file in `ls`; do
  unset one_file
  declare -A one_file
  safe_file=$(echo $file | tr '.' '_')
  one_file["${safe_file}"]=foo
  printf "%s\n" "${!one_file[@]}"
done

每个文件只输出1次 - 每次都清空了数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接