请考虑以下代码:
a=(1 2 3)
a='seven'
export a
declare -p a
输出(来自declare
)是:
declare -ax a='([0]="seven" [1]="2" [2]="3")'
所以a
是一个数组。问题:
a
不再是数组,而是一个值为seven
的简单变量?我正在寻找一个单行班,没有unset
等。注意: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问题)。
答案 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
事实证明,首先将变量的值保存到另一个,取消设置并重新分配它仍然是最好的方法。