10

两件事,首先这是我在这个论坛上的第一个问题,如果格式化到处都是,我深表歉意。其次,我没有编写那么多 bash 脚本,而且我编写的脚本之间的时间往往很长。

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

是否可以在 bash 中做这样的事情(清除数组 $array 包含):
$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,并且我宁愿不在某处对其进行硬编码,即使这很容易。

4

3 回答 3

12

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

于 2012-05-08T11:16:10.340 回答
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可以正常工作。

于 2012-05-08T11:19:30.920 回答
-1
array=()

它清除数组。我想这就是你想要的..

于 2013-08-01T08:20:16.910 回答