将单个变量分配给数组(就地)

时间:2013-09-02 09:54:03

标签: arrays bash

请考虑以下代码:

a=(1 2 3)
a='seven'

export a
declare -p a

输出(来自declare)是:

declare -ax a='([0]="seven" [1]="2" [2]="3")'

所以a是一个数组。问题:

  1. 如何更改第二行,因此a不再是数组,而是一个值为seven的简单变量?我正在寻找一个单行班,没有unset等。
  2. 为数组分配变量只会替换第一个元素,而不是整个数组。指定了这种行为在哪里?
  3. 注意:Bash v.3.2.48(OS X)。

    (我今天回答this question,这让我想到了这个问题,我正在寻找一个更清洁的解决方案。)


    编辑:我正在寻找:

    a=(1 2 3)
    
    /* One line here please :) */
    unset a
    a='seven'
    
    export a
    declare -p a
    

    但没有明确unset。在a实际上是PATH变量的特殊情况下,这很重要(请参阅this问题)。

2 个答案:

答案 0 :(得分:2)

您需要使用unset

手册中的第一个引用(如下所示)可以解释为:

a='seven'

a之前的数组相同时,说:

a[0]='seven'

引用manual

  

分配给索引数组时,如果是可选的下标   提供,该索引被分配给;否则索引   赋值的元素是语句plus分配的最后一个索引   一。索引从零开始。


  

unset内置函数用于销毁数组。 unset name [下标]   销毁索引下标的数组元素。必须小心   避免文件名扩展导致的不良副作用。未设定的名字,   其中name是一个数组,删除整个数组。 ‘*’的下标   或‘@’也删除整个数组。

答案 1 :(得分:1)

您可以使用第一个值:

a=${a[0]}

or

a=$a

因为在数组中,如果没有提供下标,它的默认值是它的第一个元素值。

如果要导出变量,则需要将其保持为数组。您可以先将其保存在变量上,取消设置并将其重置为:

b=a; unset a; a=$b
export a

或者你可以做单行:

{ unset a; IFS= read -r a; } <<< "$a"
export a

eval "unset a; IFS= read -r a" <<< "$a"
export a

注意:后者使用eval,如果使用不当会很危险,所以你必须小心使用它。

更新:似乎<<< ""在值的末尾附加换行符,因此我们无法使用read -rd ''来包含将其分隔的行。但是我们可以使用流程替换:

{ unset a; IFS= read -rd '' a; } < <(echo -n "$a")
export a

事实证明,首先将变量的值保存到另一个,取消设置并重新分配它仍然是最好的方法。