考虑以下代码:
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诉3.2.48 (OS X)。
(我今天回答了这个问题,这让我思考了这个问题,我正在寻找一个更干净的解决方案)。
编辑:,我在找一个:
a=(1 2 3)
/* One line here please :) */
unset a
a='seven'
export a
declare -p a但是不做显式的unset。当a实际上是一个PATH变量时,它在特殊情况下很重要(参见这问题)。
发布于 2013-09-02 10:26:00
您需要使用unset。
“手册”的第一句引文(下文)将解释如下:
a='seven'当a是一个数组时,是否与之前的相同:
a[0]='seven'引用手册的话
当为索引数组赋值时,如果提供了可选下标,则将该索引分配给该索引;否则,分配的元素的索引将是语句加一个分配给的最后一个索引。索引从零开始。
unset内置器用于破坏数组。unset名称包脚本在索引下标处销毁数组元素。必须注意避免文件名扩展所造成的不必要的副作用。unset名称(其中的名称是数组)移除整个数组。‘*’或‘@’的下标也会删除整个数组。
发布于 2013-09-02 09:54:55
您可以只使用第一个值:
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原来,首先将变量的值保存到另一个变量,取消它并重新分配它仍然是最好的方法。
https://stackoverflow.com/questions/18570308
复制相似问题