是否可以在bash中使用$ array =()?

时间:2012-05-08 11:08:39

标签: arrays bash

两件事,首先这是我在这个论坛的第一个问题,如果形成各种各样,我会道歉。其次我没有编写那么多bash脚本,而且我生成的脚本之间往往需要相当长的时间。

那就是说,这是我的问题。

是否可以在bash中执行类似的操作(Clear array $ array contains):
    $array=()

基本上这就是我想做的事情。我有一个带有数组变量名的变量:

array1=()  
array2=()  
arrayList="array1 array2"  


# In a function far far away
for array in $arrayList
do  
    eval arr=("\"\${$array[@]\"")  

    for index in ${!arr[@]}
    do
        echo "${arr[$index]}"
    done
    # Here is the big "?", I like to clear the array that $array refers to.
    $array=()  
done

我的数组包含包含“”(空格)的字符串,这就是我使用eval语句的原因。不确定它是否需要,但至少它是有效的。脚本或多或少都按照我的意愿工作,但我需要清除$arrayList中的数组,而不是在某处硬编码,即使这很容易。

3 个答案:

答案 0 :(得分:11)

可能最简单的事情就是unset他们。在大多数情况下,未设置的变量将与空数组完全相同,unset $array应该可以正常工作。

答案 1 :(得分:1)

你不能$foo=bar - 这不是bash中间接分配的工作方式。不幸的是,虽然能够进行间接数组赋值是ksh93中的一个可用功能,但它不是bash中正式记录的可用功能。

引用BashFAQ #6(如果您有兴趣了解有关一般使用间接变量的更多信息,请完整阅读):

  

我们不知道任何可以在POSIX或Bourne shell中复制该功能的技巧(缺少使用eval,这是非常难以安全地执行的)。 Bash几乎可以做到 - 一些间接数组技巧起作用,而另一些则没有,我们不知道所涉及的语法在将来的版本中是否会保持稳定。所以,考虑一下这个用户自担风险。

# Bash -- trick #1.  Seems to work in bash 2 and up.
realarray=(...) ref=realarray; index=2
tmp="$ref[$index]"
echo "${!tmp}"            # gives array element [2]

# Bash -- trick #2.  Seems to work in bash 3 and up.
# Does NOT work in bash 2.05b.
tmp="$ref[@]"
printf "<%s> " "${!tmp}"; echo    # Iterate whole array.

但是,清除更简单,因为unset $array可以正常工作。

答案 2 :(得分:-1)

array=()

清除阵列。我猜这就是你想要的......