代码之家  ›  专栏  ›  技术社区  ›  kamituel

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

  •  3
  • kamituel  · 技术社区  · 12 年前

    考虑以下代码:

    a=(1 2 3)
    a='seven'
    
    export a
    declare -p a
    

    输出(来自 declare )是:

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

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

    1. 如何更改第二行,所以 将不再是一个数组,而是一个具有值的简单变量 seven ? 我在找一条没有 unset
    2. 将变量赋给数组只替换第一个元素,而不是整个数组。这种行为具体在哪里?

    注:Bash诉3.2.48(操作系统X)。

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


    编辑: 我正在寻找一个:

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

    但没有做明确的 未设置 。在特殊情况下 实际上是 PATH 变量(请参见 this 问题)。

    2 回复  |  直到 9 年前
        1
  •  2
  •   devnull    12 年前

    你需要使用 unset .

    手册中的第一句话(如下所示)将解释如下:

    a='seven'
    

    什么时候 a 以前的数组是 完全相同的 说到:

    a[0]='seven'
    

    引用自 manual :

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


    这个 未设置 内置代码用于销毁数组。 未设置 名称[下标] 销毁索引处的数组元素 下标 .必须小心 避免文件名扩展带来不必要的副作用。未设置的名称, 其中name是一个数组,删除整个数组。的下标 ‘*’ ‘@’ 也会移除整个阵列。

        2
  •  1
  •   konsolebox    12 年前

    您可以只使用第一个值:

    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
    

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

    推荐文章